为什么我的命令行参数被解释为布尔值(Perl 6)?

Chr*_*oms 4 command-line perl6

鉴于此程序:

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

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

./seed.p6 --seed 1234
Seed is True
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*oms 5

你需要=在你的选项--seed和它的值之间使用一个符号1234

./seed.p6 --seed=1234
Run Code Online (Sandbox Code Playgroud)

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


你的原创

./seed.p6 --seed 1234
Run Code Online (Sandbox Code Playgroud)

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


dwa*_*ing 5

Perl 6的MAIN参数处理在渐进式输入中表现良好。可以并且应该将参数类型转换以减少歧义并改善验证:

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

在类型转换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.
Run Code Online (Sandbox Code Playgroud)