【问题标题】:Why is my command line argument being interpreted as a Boolean (Perl 6)?为什么我的命令行参数被解释为布尔值(Perl 6)?
【发布时间】:2015-04-29 19:28:11
【问题描述】:

鉴于这个程序:

#!/bin/env perl6
sub MAIN ($filename='test.fq', :$seed=floor(now) )
{
    say "Seed is $seed";
}

当我在没有任何命令行参数的情况下运行它时,它工作正常。但是,当我给它一个seed 的命令行参数时,它说它的值是True

./seed.p6 --seed 1234
Seed is True

为什么数字 1234 被解释为布尔值?

【问题讨论】:

    标签: command-line raku


    【解决方案1】:

    Perl 6 的 MAIN 参数处理非常适合渐进式输入。参数可以而且应该进行类型转换以减少歧义并改进验证:

    #!/bin/env perl6                                                                                                                                    
    sub MAIN (Str $filename='test.fq', Int :$seed=floor(now))
    {
        say "Seed is $seed.";
    }
    

    在将seed 类型转换为Int 后,必须为该选项提供一个数字参数,并且不再默认为布尔值:

    perl6 ./seed.pl -seed 1234
    Usage:
      ./seed.pl [--seed=<Int>] [<filename>] 
    
    
    perl6 ./seed.pl -seed=abc
    Usage:
      ./seed.pl [--seed=<Int>] [<filename>] 
    
    
    perl6 ./seed.pl -seed=1234
    Seed is 1234.
    

    【讨论】:

      【解决方案2】:

      您需要在您的选项--seed 与其值1234 之间使用= 符号:

      ./seed.p6 --seed=1234
      

      由于您的MAIN 子例程签名中有一个位置参数(即$filename),第一个不与带有= 符号的值绑定的参数将被分配给它。


      你的原创

      ./seed.p6 --seed 1234
      

      被解释为好像1234 是文件名(即它被分配给变量$filename)。由于不带参数的命令行选项被视为True,因此在您对该脚本的原始调用中,$seed 被分配了True

      【讨论】:

      • 欢迎其他答案、cmets、建议和编辑。
      猜你喜欢
      • 1970-01-01
      • 2014-03-11
      • 2015-08-08
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多