从stdin一次执行一个内衬处理一次CSV线:
perl6 -ne 'my @a; $_.split(",").kv.map: {@a[$^k]+=$^v}; say @a; ENTER {say "ENTER"}; BEGIN {say "BEGIN"}; LEAVE {say "LEAVE"}; END {say "END"}';
输入:
1,1
1,1
^D
提供以下输出:
BEGIN
ENTER
1,1
[1 1]
1,1
[2 2]
LEAVE
END
在这里,我们可以看到一个衬板不是多次执行的块,因为ENTER和LEAVE移相器仅执行一次。
随着变量@a的累积,这是有道理的。如果一个衬板是一个块,则@a的值将每次重置。
我的问题是主题变量$ _如何更新?主题变量是一个Str(至少是$ _。^ name所说的)。如何在不重新输入块的情况下更新其值?
我想念什么?
最佳答案
当您添加-n
时,它将在您的代码周围添加一个for
循环。
您认为它添加了这样的内容:
for lines() {
# Your code here
}
编译器仅添加用于循环的抽象语法树节点,而无需实际添加块。
(
# Your code here
) for lines()
(它可能被解释为一个错误。)
要使其像第一个一样工作:
( # -n adds this
-> $_ { # <-- add this
# Your code here
}( $_ ) # <-- add this
) for lines() # -n adds this
我尝试仅添加一个裸块,但是编译器添加循环的方式导致该方法不起作用。
通常,
ENTER
和LEAVE
的作用域为一个块{}
,但如果没有一个块,它们的作用域也为"file"。ENTER say 'ENTER file';
LEAVE say 'LEAVE file';
{
ENTER say ' ENTER block';
LEAVE say ' LEAVE block';
}
ENTER file
ENTER block
LEAVE block
LEAVE file
由于您的代码中没有任何块,因此所有内容都限定在"file"范围内。
关于command-line - Perl6一线执行。主题如何更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54357410/