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

Command line 为什么我的命令行参数被解释为布尔值(Perl 6)?,command-line,raku,Command Line,Raku,鉴于该计划: #!/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被解释为布尔值?您需要在选项--seed与其值1234之间使用=符号: ./s

鉴于该计划:

#!/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被解释为布尔值?

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

./seed.p6 --seed=1234
由于在
子例程签名中有一个位置参数(即
$filename
),第一个未绑定到带有
=
符号的值的参数将被分配给它


你的原创

./seed.p6 --seed 1234

被解释为
1234
是文件名(即,它被分配给变量
$filename
)。由于不带参数的命令行选项被认为是
True
,因此在最初调用该脚本时,
$seed
被指定为
True

Perl 6的主参数处理与渐进式键入配合得很好。参数可以而且应该进行类型转换,以减少歧义并改进验证:

#!/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.
perl6./seed.pl-seed 1234
用法:
./seed.pl[--seed=][]
perl6./seed.pl-seed=abc
用法:
./seed.pl[--seed=][]
perl6./seed.pl-seed=1234
种子是1234。

欢迎其他答案、评论、建议和编辑。