在Perl 5和Perl 6之间差异的总结中,注意到该wantarray功能已经消失:
wantarray()走了
wantarray走了.在Perl 6中,上下文向外流动,这意味着例程不知道它在哪个上下文中.
相反,你应该返回在每个上下文中做正确事情的对象.
有人可以举例说明如何创建这样的对象吗?
在Perl 5中,我可以创建一个字符串的文件句柄,并从字符串中读取或写入,就好像它是一个文件一样.这非常适合使用测试或模板.
例如:
use v5.10; use strict; use warnings;
my $text = "A\nB\nC\n";
open(my $fh, '<', \$text);
while(my $line = readline($fh)){
print $line;
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在Perl 6中做到这一点?以下不为Perl 6的工作(至少对于上运行我的Perl6的实例MoarVM 2015.01从Rakudo星2015年1月发布 64位的CentOS 6.5):
# Warning: This code does not work
use v6;
my $text = "A\nB\nC\n";
my $fh = $text;
while (my $line = $fh.get ) {
$line.say;
}
# Warning: Example of nonfunctional code
Run Code Online (Sandbox Code Playgroud)
我收到错误消息:
No such method 'get' for invocant of type 'Str'
in block <unit> …Run Code Online (Sandbox Code Playgroud) 在Perl文档中,有一个关于.postfix/.postcircumfix的部分,它说
在大多数情况下,可以在后缀或后缀之前放置一个点:
my @a;
@a[1, 2, 3];
@a.[1, 2, 3]; # Same
Run Code Online (Sandbox Code Playgroud)
从技术上讲,不是真正的运营商; 它的语法特殊于编译器.
我试过自己:
> my @a = 1,2,3,4,5
> @a[1] # 2
> @a.[1] # 2
> my %a = Perl => 6, Python => 3, PHP => 7
> %a<Perl> #6
> %a.<Perl> #6
> my @weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
> @weekdays.antipairs.hash{'Sunday'} # 6, I expected it to be syntax wrong, but it did work!
> @weekdays.antipairs.hash.{'Sunday'} # 6, seems …Run Code Online (Sandbox Code Playgroud) 我对双连接应该如何工作感到困惑.
这有点道理:
say all('a', 'b', 'c') ~ any('d', 'e');
Run Code Online (Sandbox Code Playgroud)
给
all(any(ad, ae), any(bd, be), any(cd, ce))
Run Code Online (Sandbox Code Playgroud)
这没有意义:
say any('a', 'b', 'c') ~ all('d', 'e');
Run Code Online (Sandbox Code Playgroud)
给
all(any(da, db, dc), any(ea, eb, ec))
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为我希望在字母'd'左边的字母'a'现在在右边.
我在试验在Perl 6 REPL上定义运算符时遇到了问题,并注意到它们确实有效,但只有在它们被定义的同一行上使用时才会有效.为什么会这样?
> sub postfix:<!>(Int $x where { $x >= 0 }) { [*] 1..$x }; 6!;
720
> 6!;
===SORRY!=== Error while compiling:
Negation metaoperator not followed by valid infix
------> 6!?;
expecting any of:
infix
infix stopper
Run Code Online (Sandbox Code Playgroud) operators user-defined-functions perl6 read-eval-print-loop raku
perl6如何确定proto token首先匹配哪个?
下面的代码按预期方式工作,它与string匹配1234,并Grammar::Tracer显示与之匹配的第一个标记是s:sym<d>,这是有意义的,因为它是最长的标记。
但是,如果我将文字更改为令牌,例如,将token threeform 更改'3'为<digit>,它将无法匹配,并Grammar::Tracer显示s:sym<b>与first匹配。
移动s:sym<d>到顶部,在两种情况下都匹配字符串,但是对该行为的解释是什么?
#!/usr/bin/env perl6
no precompilation;
use Grammar::Tracer;
grammar G {
token TOP { <s> }
proto token s { * }
token s:sym<a> { <one> }
token s:sym<b> { <one> <two> }
token s:sym<c> { <one> <two> <three> }
token s:sym<d> { <one> <two> <three> <four> }
token one { '1' }
token two …Run Code Online (Sandbox Code Playgroud) 如果语法不匹配,有没有办法让Perl 6生成错误消息?或者至少返回它处理的最后一个数据的位置?如果从解析器获得的所有内容都是"不匹配",则很难修复语法错误.
考虑这些子程序都采用一个命名参数.命名参数应该是可选的,我没有看到任何说法有例外.
没有类型限制,没有问题; 命名参数不是必需的.使用可以接受类型对象的类型约束(没有注释: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 …
我想每秒打印当前时间,也想睡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,这可能吗?