Consider the following code
my $a = "AABBCCBGG";
say join "\n", do for $a.comb.squish {
$a ~~ s/^ ($_+) //;
}
Run Code Online (Sandbox Code Playgroud)
versus
my $a = "AABBCCBGG";
say join "\n", do for $a.comb.squish -> $b {
$a ~~ s/^ ($b+) //;
}
Run Code Online (Sandbox Code Playgroud)
The first hangs forever while the last executes as expected. Is this an error or is there some finer detail while using the implicit $_ that I don't understand? Using Rakudo Star 2019.03.01.
您使用$_的代码在道德上等同于:
/''+/
Run Code Online (Sandbox Code Playgroud)
它将永远循环(因为空字符串''匹配无限次)。
(好吧,我只显示了一个简单的匹配,并且$_必须将其分配或绑定到强制转换为字符串的某个值,否则将不会发生无限循环,并且您的代码必须绕过其循环两次才能变成一个道德上与上述相同,但这些都是鲱鱼。)
在使用
$_我不理解的隐式函数时,有一些更好的细节吗?
smartmatch运算符将左侧别名为
$_
在代码中:
lhs ~~ rhs;
Run Code Online (Sandbox Code Playgroud)
等效于:
$_ := lhs;
rhs.ACCEPTS(lhs);
Run Code Online (Sandbox Code Playgroud)
我怀疑您没有考虑上述两行中的第一行。
(只需使用第二行自身,如果你想避免这个话题化。1)
假定$_分配了一个定义的非空字符串:
s/$_//;
Run Code Online (Sandbox Code Playgroud)
将始终更新$_为空字符串('')。
和:
$a ~~ s/^ ($_+) //;
Run Code Online (Sandbox Code Playgroud)
将别名$_来$a,然后同时更新$_,并$a为空字符串。
因此,第二次在for循环中~~再次使用别名$_给$a,现在它包含一个空字符串,然后您便得出了我的答案所基于的无限循环条件。
1在下面的评论中,Jo询问了为什么 ~~ 需要 “主题化”(别名$_lhs)。权威的答案大概存储在@Larry的集体大脑中,可以说是P6设计文档最好地表达了这一点(在页面搜索“智能匹配”和“智能匹配”似乎是票证)。但是,我会就此事发表自己的想法。
首先,aiui,不需要这种方式。
Aiui @Larry可能刚刚决定,依赖于当前主题的构造(我认为这意味着//,s///以及适当的例行调用)与P5一样。
这是在P5(具有适当的编译指示)和P6中运行的一些代码:
my $a = 'a value';
$_ = 'another value';
say $a ~~ s/value/changed string/;
say $a;
say $_;
Run Code Online (Sandbox Code Playgroud)
您期望结果如何?
在P5中:
a value
another changed string
Run Code Online (Sandbox Code Playgroud)
在P6中:
?value?
a changed string
another value
Run Code Online (Sandbox Code Playgroud)
P5保持$a不变,进行修改$_,然后将修改后的结果与原始结果进行比较,$a并得出结论,它们不匹配(因此该say $a ~~ ...行表示空白行)。
P6别名$_到$a 了智能匹配的持续时间,叶$a永久%的修改s///,并恢复$_到以前的值之后。
如果我们坚持使用P5的方式,我们也将无法编写以下内容:
foo ~~ / ... /如果foo匹配正则表达式,则为真;
my $a = 'AA'; $a ~~ .uc不论$_ 此代码之前或之后的值如何,它都为真;
foo ~~ .&bar匹配bar子在哪里期待一个参数,我们希望它得到foo。
在此期间,.ACCEPTS也可用。因此,这并不是说您不能做与P5相同的事情。只是,默认情况下,对主题起作用的构造可能是人们可能期望的,如果他们不首先接触P5,并@Larry认为总体上是一件好事。
总而言之,Jo,我听说P5达到了您的期望,但是至少可以部分地认为是因为您已经使用了 P5,并且您的期望在很大程度上取决于它的作用,并且在考虑了它之后是否想保留它仍然是您喜欢的东西以上,并给自己足够的时间来吸收它。我很想听听您关于接下来一个月的感觉的后续评论!
至少,这是我目前对此主题的想法。