command-line - Perl6一线执行。主题如何更新?

标签 command-line raku

从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

我尝试仅添加一个裸块,但是编译器添加循环的方式导致该方法不起作用。

通常,ENTERLEAVE的作用域为一个块{},但如果没有一个块,它们的作用域也为"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/

相关文章:

c++ - 如何在 Windows 上使用命令行运行 UnitTest++

python - 使用 argparse 获取选定的子命令

asynchronous - 在同一个 React block 中使用不同的线程调度器会发生什么?

input - perl6 有没有办法进行可编辑的提示输入?

performance - 可能使用并发/异步/并行方法比较 2 个数据集

linux - 为什么权限表达式653的意思是rw-r-x-wx

linux - 从 shell 优先运行进程(不是 “nice” )

shell - 读取文件的特定行

raku - 检查字符串是否包含子字符串。此外,获取匹配的索引和数量(乐)

expression - `do` 关键字是运行 block 还是将其视为表达式?