Perl 6遍历命令行参数

Tay*_*Lee 9 perl6

我想写一个Perl 6程序,它对不确定数量的文件执行相同的操作,就像你rm file1.txt file2.txt file3.txt在Linux中使用它一样.

我的代码看起来像这样:

#!/usr/bin/env perl6


my @args = @*ARGS.perl;

for @args -> $arg {
    say $arg
}
Run Code Online (Sandbox Code Playgroud)

但是,当我调用它时,./loop_args.pl6 file1.txt file2.txt我得到以下输出:["file1.txt", "file2.txt"]

我究竟做错了什么?我只是想让它成为一个数组.

Kin*_*ley 9

对于Perl6,arguments数组是@*ARGS,这给出了代码:

#! /usr/bin/env perl6

use v6;

for @*ARGS -> $arg
{
    print("Arg $arg\n");
}  
Run Code Online (Sandbox Code Playgroud)

所以你只需要删除.perl你的my @args = @*ARGS.perl;行.

编辑:根据拉尔夫斯的评论更新

  • 澄清@ Scimon的评论你不需要`use strict;`因为P6默认为strict.当我写评论的时候,我还会注意到`my $ arg;`声明*a*`$ arg`,但它是多余的,具有误导性.` - > $ arg`声明*另一个*`$ arg`,它会遮挡块内的`my`. (2认同)

Sci*_*mon 6

所以这取决于你想要对文件做什么.如果你想通读它们,你可能想要看一下$*ARGFILES这是一个IO :: CatHandle对象,它将所有参数批量化并将它们视为文件列表.所以要打印出来,你可以做到.

#! /usr/bin/env perl6
use v6;

for $*ARGFILES.handles -> $IO {
    $IO.path.say
}
Run Code Online (Sandbox Code Playgroud)

好吧,这比看@@ ARGS有点复杂.但是如果你想为每个文件打印前5行呢?

#! /usr/bin/env perl6
use v6;

for $*ARGFILES.handles -> $IO {
    say $IO.lines: 5;
}
Run Code Online (Sandbox Code Playgroud)

或者您可能只想阅读所有文件的内容并打印出来?

#! /usr/bin/env perl6
use v6;

.say for $*ARGFILES.lines;
Run Code Online (Sandbox Code Playgroud)

希望能给你一些想法.