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

Why is my command line argument being interpreted as a Boolean (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 被解释为布尔值?

您需要在您的选项 --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.