鉴于此程序:
#!/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 被解释为布尔值?
鉴于此程序:
#!/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
由于您的MAIN
子例程签名中有一个位置参数(即$filename
),因此第一个不与带有=
符号的值绑定的参数将被分配给它。
你的原创
./seed.p6 --seed 1234
被解释为1234
文件名(即它被分配给变量$filename
)。由于没有参数的命令行选项被认为是True
,在您对该脚本的原始调用中$seed
被分配。True
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.