【问题标题】:How do I take multiple filenames from the Raku command line?如何从 Raku 命令行获取多个文件名?
【发布时间】:2021-09-15 07:09:50
【问题描述】:

这个 Raku 程序按我的预期工作:

sub MAIN($name) { say "Got $name" }

我可以在命令行上传递一个名字:

$ raku m1.raku foo
Got foo

然而,明显的扩展,

sub MAIN(@names) { say "Got $_" for @names }

不起作用:

$ raku mm.raku foo
Usage:
  mm.raku <names>
$ raku mm.raku foo bar
Usage:
  mm.raku <names>

我做错了什么?

【问题讨论】:

    标签: command-line command-line-arguments raku


    【解决方案1】:

    @cjm 的答案是您的问题的正确答案。但正如 Jan 所说,还有另一种方法:

    说“得到:”@*ARGS

    其中@*ARGS 是在命令行中定义为args 的动态变量。

    $*ARGFILES 有一些额外的细微差别。如果没有参数,则在 main 之外从 @*ARGS 或 $*IN 获取其值。在 main 里面它只是做 $*IN。

    【讨论】:

      【解决方案2】:

      有一个特殊的$*ARGFILES 变量,它提供了一种在命令行上迭代传递给程序的文件的方法。

      #!/usr/bin/raku
          
      for $*ARGFILES.handles -> $fh {
      
          say $fh;
      }
      
      $ ./enum_files.raku links.txt words.txt 
      IO::Handle<"links.txt".IO>(opened)
      IO::Handle<"words.txt".IO>(opened)
      

      我们可以使用它的lines 方法来读取给定文件的行。

      #!/usr/bin/raku
      
      .say for $*ARGFILES.lines
      
      $ ./read_lines.raku words.txt words2.txt 
      sky
      cloud
      cup
      rock
      war
      tea
      coffee
      falcon
      ...
      

      【讨论】:

        【解决方案3】:

        @cjm 说了什么。

        但是,您可以更进一步,检查您指定的名称是否实际上是文件。如果不是,则生成错误消息。诀窍是使用多调度:

        subset File of Str where *.IO.f;
        
        multi sub MAIN(*@files where @files.all ~~ File) {
            say "These are all files: @files.join(",")";
        }
        multi sub MAIN(*@files) {
            say "These are *NOT* files: @files.grep(* !~~ File).join(",")";
        }
        

        如果命令行上指定的所有名称实际上都是文件,则将运行第一个候选。如果第一个候选者没有触发,则第二个候选者将运行,这意味着并非所有指定的名称实际上都是文件。

        【讨论】:

          【解决方案4】:

          您必须为此使用slurpy array 签名:

          sub MAIN(*@names) { say "Got $_" for @names }
          

          按需要工作:

          $ raku mm.raku
          $ raku mm.raku foo
          Got foo
          $ raku mm.raku foo bar
          Got foo
          Got bar
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-04
            • 2012-12-28
            • 1970-01-01
            • 1970-01-01
            • 2010-09-16
            • 1970-01-01
            • 2011-10-25
            • 1970-01-01
            相关资源
            最近更新 更多