在Perl中Moo,您可以使用实现子around,这些子将包装类中的其他方法。
around INSERT => sub {
my $orig = shift;
my $self = shift;
print "Before the original sub\n";
my $rv = $orig->($self, @_);
print "After the original sub\n";
};
Run Code Online (Sandbox Code Playgroud)
我希望有一个从5到1的循环.我知道我可以轻松地与..运算符相反:
for 1..5 { .print }
12345
Run Code Online (Sandbox Code Playgroud)
但是当使用..运算符并反转边时,它似乎不会生成for可以使用的有效范围:
for 5..1 { .print }
Nil
Run Code Online (Sandbox Code Playgroud)
我知道我可以reverse在Range对象上使用该方法:
for (1..5).reverse { .print }
54321
Run Code Online (Sandbox Code Playgroud)
但是,我希望..运营商能够以一定的方式在1次呼叫中生成数字列表.我的问题是,如何创建一个使用..运算符倒计时的Range ?
现在,我有一个MAIN可以接受一个或多个字符串参数的子.但我使用两个单独的参数MAIN来做到这一点:
sub MAIN (
Str:D $file,
*@files,
) {
@files.prepend: $file;
# Rest of the program
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道是否有更惯用的方法来实现这一点,因为我目前的解决方案感觉有点笨重,而不是非常Perly.
我写了一个小的示例文件来了解有关Perl 6 POD的更多信息,我正在使用p6docPOD文档渲染一个小的手册页.但是,p6doc也尝试解析POD文档之外的声明器块.这在输出中看起来不是特别好.有没有办法在使用时忽略声明器块p6doc?
我正在使用的代码示例是:
#! /usr/bin/env perl6
use v6.c;
#| Greet people on the command line.
sub MAIN (
#| A name to greet.
$names,
#| Optional. Additional names to greet.
*@names,
) {
*
}
=begin pod
=NAME greeter
=AUTHOR Patrick Spek
=VERSION 0.0.1
The greeter application greets someone via a terminal. At least 1 name is
required, but multiple names can be given to greet many people in one go.
=end pod …Run Code Online (Sandbox Code Playgroud) 我正在研究Perl 6模块,Pod::To::Anything以便创建一个简单的界面来创建Perl 6 Pod格式化程序.我正在将渲染分成多个render方法,每个方法都必须处理Pod规范的给定部分.
为了确保完成基于此类的Pod格式化程序,我想添加涵盖所有可能的Pod对象的抽象方法.但是,这要求我where多次使用一个子句:
multi method render (Pod::Block::Named:D $ where *.name eq "NAME" --> Str) { … }
Run Code Online (Sandbox Code Playgroud)
我试图按如下方式实现它:
multi method render (Pod::Block::Named:D $pod where *.name eq "NAME" --> Str) { ".TH {self.pod-contents($pod)}\n" }
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行该程序时,Perl 6抱怨一种方法没有实现:
===SORRY!=== Error while compiling /home/tyil/projects/personal/perl6-Pod-To-Man/lib/Pod/To/Man.pm6 (Pod::To::Man)
Multi method 'render' with signature :(Pod::To::Man $: Pod::Block::Named:D $ where { ... }, *%_ --> Str) must be implemented by Pod::To::Man because it is required by a role at …Run Code Online (Sandbox Code Playgroud) 我有一个模块App::Assixt,我最近做了一个相对较大的变化.我当然在我的本地系统上对它进行了测试,但在将其称为"稳定版本"之前,我想先进行一些现场测试.
有没有办法将此版本"标记"为"alpha"或"release-candidate",所以此版本只会由选择使用不稳定/测试版本的人安装?
我正在编写一个新的Perl 6项目,希望能够测试所有部件是否use正确.为此,我正在使用模块中的use-ok子程序Test.我正在尝试使用以下代码轻松测试所有模块文件:
"META6.json".IO.slurp.&from-json<provides>
.grep(*.value.starts-with("lib")).Hash.keys
.map({ use-ok $_ })
Run Code Online (Sandbox Code Playgroud)
我的问题是有一些文件包含MAIN子程序的定义.从运行时看到的输出prove -e 'perl6 -Ilib' t,看起来其中一个文件正在MAIN执行,然后测试停止.
我想测试这些文件是否可以use正确运行,而不是实际运行其中MAIN定义的subs.我该怎么做?
我depends从一个循环遍历数组META6.json.我加载了一个Hash使用JSON::Fast.for但是,当我使用循环遍历它时,它只通过循环一次,并且该项是相同的数组:
use JSON::Fast;
my %meta = from-json(slurp("META6.json"));
for %meta<depends> -> $dependency {
dd $dependency;
}
Run Code Online (Sandbox Code Playgroud)
这段代码返回
Array $dependency = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
Run Code Online (Sandbox Code Playgroud)
我希望它能循环%meta<depends>6次,每次迭代都会从该数组中获取不同的元素.
为了更好地衡量,这是dd %meta<depends>示例的输出:
Array %meta = $["Config::Parser::toml:ver<1.0.1+>", "Config:api<1>:ver<1.3.5+>", "Dist::Helper:ver<0.21.0+>", "Hash::Merge", "Terminal::Getpass:ver<0.0.5+>", "zef"]
Run Code Online (Sandbox Code Playgroud)
为什么循环不按我预期的方式循环?
编辑:我正在使用最新的Rakudo Star:
This is Rakudo Star version 2018.04.1 built on MoarVM version 2018.04.1
implementing Perl 6.c.
Run Code Online (Sandbox Code Playgroud) 在Perl 6的POD文档对使用访问当前文件的POD文档一节$=pod.没有关于访问另一个文件的POD文档的信息.
如何在不改变当前文件的情况下访问另一个文件的POD结构$=pod?
我正在尝试解决这个问题,这实际上是由另一个与callwithand 的不同行为相关的stackoverflow问题引发的samewith.后者似乎有明确的定义,然而,它并不是那么清楚callwith.
看看这个例子:
proto how-many(|) {*}
multi sub how-many( Pair $a, Pair $b ) {
say "Int $a and $b";
return "There are $a and $b"
}
multi sub how-many( $a, $b ) {
say "Not int $a and $b";
my $calling = callwith( 1 => $a, 2 => $b );
return $calling;
}
say how-many( "little piggie","littler piggie" );
Run Code Online (Sandbox Code Playgroud)
根据文档,callwith应该调用下一个匹配的候选人.但是,这是输出:
Not int little piggie and …Run Code Online (Sandbox Code Playgroud)