2015-04-29 2 views
2

Учитывая эту программу:Почему аргумент командной строки интерпретируется как логический (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 интерпретируется как логическое значение?

ответ

3

Управление основными аргументами Perl 6 отлично подходит для постепенного ввода текста. Аргументы могут и должны быть типаж, чтобы уменьшить неопределенность и улучшить валидацию:

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

После типажей seed к Int, этот параметр должен быть дан числовой аргумент и больше не по умолчанию к Boolean:

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. 
2

Вы должны использовать = знак между опцией --seed и его значением 1234:

./seed.p6 --seed=1234 

Поскольку у вас есть позиционное аргумент в вашей MAIN подпрограммой подписи (т.е. $filename), то первый аргумент не привязан к значение с значком = будет присвоено ему.


Ваш оригинальный

./seed.p6 --seed 1234 

толкуется, как если бы 1234 были имя файла (т.е. он был назначен переменной $filename). Поскольку параметр командной строки без аргумента считается True, True был назначен True в вашем первоначальном вызове этого сценария.

+0

Другое ответы, комментарии, предложения и изменения приветствуются. –

Смежные вопросы