{
sub a {
print 1;
}
}
a;
Run Code Online (Sandbox Code Playgroud)
一个错误,是吗?
a 不应该从外面获得.
它在Perl 6*中有效吗?
*对不起,我还没有安装它.
如果语法不匹配,有没有办法让Perl 6生成错误消息?或者至少返回它处理的最后一个数据的位置?如果从解析器获得的所有内容都是"不匹配",则很难修复语法错误.
假设我想要a,b和c中的2个字母的所有排列.
我可以:
my @perm = <a b c>.combinations(2)».permutations;
say @perm;
# [((a b) (b a)) ((a c) (c a)) ((b c) (c b))]
Run Code Online (Sandbox Code Playgroud)
这很接近,但不完全是我需要的.我如何"扁平化"这样以便得到:
# [(a b) (b a) (a c) (c a) (b c) (c b)]
Run Code Online (Sandbox Code Playgroud)
?
这有点意外的行为,可能会咬人初学者.首先,这是打算吗?其次,Perl 6使用什么来猜测要创建哪个对象?它是否开始认为它是Block或Hash并稍后更改,还是最终决定?
你可以用大括号和胖箭头构造一个哈希:
my $color-name-to-rgb = {
'red' => 'FF0000',
};
put $color-name-to-rgb.^name; # Hash
Run Code Online (Sandbox Code Playgroud)
使用另一个Pair符号也会创建哈希.
my $color-name-to-rgb = {
:red('FF0000'),
};
Run Code Online (Sandbox Code Playgroud)
但是,如果没有胖箭,我会得到一个Block:
my $color-name-to-rgb = {
'red', 'FF0000',
};
put $color-name-to-rgb.^name; # Block
Run Code Online (Sandbox Code Playgroud)
还有其他方法来定义哈希,但我问的是这个特定的语法,而不是寻找我已经知道的解决方法.
$ perl6 -v
This is Rakudo version 2017.04.3 built on MoarVM version 2017.04-53-g66c6dda
implementing Perl 6.c.
Run Code Online (Sandbox Code Playgroud) 在Bar.pm中,我声明了一个具有权限(作者)和版本的类:
class Bar:auth<Camelia>:ver<4.8.12> {
}
Run Code Online (Sandbox Code Playgroud)
如果我在程序中使用它,我如何查看我正在使用的模块版本,编写者以及模块加载器如何找到它?与往常一样,文档链接很重要.
这个问题也被问到perl6用户,但在出现满意答案(或文档链接)之前就已经死了.
这个问题的另一个问题是许多人没有将这些信息添加到他们的类或模块定义中.它显示在META.json文件中,但不显示在代码中.
考虑这些子程序都采用一个命名参数.命名参数应该是可选的,我没有看到任何说法有例外.
没有类型限制,没有问题; 命名参数不是必需的.使用可以接受类型对象的类型约束(没有注释:U,和:_),没有问题.
Parameter '$quux' of routine 'quux' must be an object instance of type 'Int',
not a type object of type 'Int'. Did you forget a '.new'?
in sub quux at /Users/brian/Desktop/type.p6 line 16
in block <unit> at /Users/brian/Desktop/type.p6 line 37
Run Code Online (Sandbox Code Playgroud)
对于需要定义值(带注释:D)的类型约束,命名参数不再是可选的.也就是说,对于任何其他定义,我不必提供值.随着:D我必须提供一个值.我宁愿不遗漏,:D因为我想要的价值必须定义.
来自签名文档:
通常,类型约束仅检查传递的值是否是正确的类型.
但是,我没有传递任何价值.我认为这些约束只对作业有影响.因为我没有明确地提供一个值来分配我期望没有任何分配也没有问题.Rakudo 2017.10的情况并非如此.这导致我以各种令人讨厌的方式解决这个问题.这与我的问题有关Perl 6块是一个参数还是没有?我试图区分零和一个参数的情况.
我可以通过分配默认值来解决这个问题,但在某些情况下,没有默认值是有意义的.Bool例如,A 很容易,但确定的Int是什么?无论是什么,都会有一些神奇的价值,会使代码变得复杂和分散注意力.我已经完成了这个,Perl 6有一个Infinite Int,但我侥幸逃脱,因为Inf在这种情况下作为有效值.
sub foo ( :$foo ) { …Run Code Online (Sandbox Code Playgroud) Perl 6正则表达式/语法比Perl 5或相关的Perl兼容正则表达式更好结构化,更强大和可读性,包括Java中的正则表达式.我正在寻找一种方法来使用Java中的正则表达式/语法代码执行Perl 6代码.
这是我想要做的类似的常见示例:
grammar Calculator {
token TOP { [ <add> | <sub> ] }
rule add { <num> '+' <num> }
rule sub { <num> '-' <num> }
token num { \d+ }
}
class Calculations {
method TOP ($/) { make $<add> ?? $<add>.made !! $<sub>.made; }
method add ($/) { make [+] $<num>; }
method sub ($/) { make [-] $<num>; }
}
say Calculator.parse('2 + 3', actions => Calculations).made;
# OUTPUT: «5?»
Run Code Online (Sandbox Code Playgroud)
也许我必须Class …
今天我注意到序列'A' ... 'AA'只包含一个元素:
> 'A' ... 'AA'
(A)
Run Code Online (Sandbox Code Playgroud)
我认为它将包含27:字母加上决赛AA.
如果我明确提供了一个生成器,它会:
> 'A', *.succ ... 'AA'
(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA)
Run Code Online (Sandbox Code Playgroud)
文档说默认生成器是*.succ或者*.pred取决于端点的比较方式.但:
> 'A' cmp 'AA'
Less
Run Code Online (Sandbox Code Playgroud)
所以看来我应该*.succ默认获得生成器.我绝对没有得到*.pred发电机:
> 'A', *.pred ... 'AA'
Decrement out of range
in whatevercode at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我想每秒打印当前时间,也想睡5秒钟5秒钟:
react {
whenever Supply.interval(1) {
say DateTime.now.posix;
}
whenever Supply.interval(5) {
sleep 10;
say 'Sleep Done';
}
whenever signal(SIGINT) {
say "Done.";
done;
}
}
Run Code Online (Sandbox Code Playgroud)
输出不是我想要的:
1542371045
Sleep Done
1542371055
Sleep Done
1542371065
Sleep Done
1542371075
Done.
...
Run Code Online (Sandbox Code Playgroud)
我想要的是这个:
1542371045
1542371046
1542371047
1542371048
1542371049
Sleep Done
1542371059
1542371060
1542371061
1542371062
1542371063
Sleep Done
Done.
Run Code Online (Sandbox Code Playgroud)
不太了解Promise,Supply...关于Perl 6,这可能吗?
我正在使用IO :: Socket :: Async在P6中重写我的P5套接字服务器,但收到的数据在结尾处被截断1个字符,并且在下一个连接上收到1个字符.来自Perl6 Facebook组的人(Jonathan Worthington)指出,这可能是由于字符串的性质和字节在P6中的处理方式截然不同.引:
在Perl 6中,字符串和字节的处理方式截然不同.值得注意的是,字符串在字形级别上起作用.接收Unicode数据时,不仅可能将多字节序列分组,还可以分割多码点序列.例如,一个数据包的末尾可能包含字母"a",而下一个数据包可能是组合的重音符号.因此,它不能安全地传递"a",直到看到下一个数据包如何开始.
我的P6正在MoarVM上运行
use Data::Dump;
use experimental :pack;
my $socket = IO::Socket::Async.listen('0.0.0.0', 7000);
react {
whenever $socket -> $conn {
my $line = '';
whenever $conn {
say "Received --> "~$_;
$conn.print: &translate($_) if $_.chars ge 100;
$conn.close;
}
}
CATCH {
default {
say .^name, ': ', .Str;
say "handled in $?LINE";
}
}
}
sub translate($raw) {
my $rawdata = $raw;
$raw ~~ s/^\s+|\s+$//; # remove heading/trailing whitespace
my $minus_checksum …Run Code Online (Sandbox Code Playgroud)