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



给定此程序:

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

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.
您需要

在选项--seed及其值1234之间使用=符号:

./seed.p6 --seed=1234

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


您的原件

./seed.p6 --seed 1234

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