Как анализировать и проверять аргументы командной строки в Perl 6?
в Perl 5, я могу использовать Getopt::Long
для разбора аргументов командной строки с некоторой проверкой (см. ниже изhttp://perldoc.perl.org/Getopt/Long.html).
use Getopt::Long;
my $data = "file.dat";
my $length = 24;
my $verbose;
GetOptions ("length=i" => $length, # numeric
"file=s" => $data, # string
"verbose" => $verbose) # flag
or die("Error in command line argumentsn");
say $length;
say $data;
say $verbose;
здесь =i
на "length=i"
создает ограничение числового типа для значения, связанного с --length
и =s
на "file=s"
создает аналогичное ограничение типа string.
как сделать что-то подобное в Perl 6?
1 ответов
основы
эта функция встроена в Perl 6. Вот эквивалент вашего Getopt::Long
код в Perl 6:
sub MAIN ( Str :$file = "file.dat"
, Num :$length = Num(24)
, Bool :$verbose = False
)
{
$file.say;
$length.say;
$verbose.say;
}
MAIN
- Это специальная подпрограмма, которая автоматически анализирует аргументы командной строки, основанных на ее подпись.
Str
и Num
укажите ограничения строкового и числового типов.
Bool
делает $verbose
двоичный флаг, который является False
если отсутствует или если вызывается как --/verbose
. (The /
на --/foo
is общий синтаксис командной строки Unix для установки аргумента в False
).
:
, добавленный к переменным в сигнатуре подпрограммы, делает их именованными (вместо позиционных) параметров.
значения по умолчанию предоставляются с помощью $variable =
, за которым следует значение по умолчанию.
псевдонимы
если вы хотите один символ или другие псевдонимы, вы можете использовать :f(:$foo)
синтаксис.
sub MAIN ( Str :f(:$file) = "file.dat"
, Num :l(:$length) = Num(24)
, Bool :v(:$verbose) = False
)
{
$file.say;
$length.say;
$verbose.say;
}
:x(:$smth)
дополнительно псевдоним --smth
например, короткий псевдоним -x
в этом примере. Также доступно несколько псевдонимов и полное имя, вот пример: :foo(:x(:bar(:y(:$baz))))
вам --foo
, -x
, --bar
, -y
и --baz
и если кто-нибудь из них перейдет к $baz
.
позиционные Аргументы (и примеры)
MAIN
также может использоваться с позиционными аргументами. Вот, например,угадайте номер (из кода Розетты). По умолчанию используется значение min 0 и max 100, но можно ввести любое минимальное и максимальное число. Используя is copy
позволяет изменять параметр в рамках подпрограммы:
#!/bin/env perl6
multi MAIN
#= Guessing game (defaults: min=0 and max=100)
{
MAIN(0, 100)
}
multi MAIN ( $max )
#= Guessing game (min defaults to 0)
{
MAIN(0, $max)
}
multi MAIN
#= Guessing game
( $min is copy #= minimum of range of numbers to guess
, $max is copy #= maximum of range of numbers to guess
)
{
#swap min and max if min is lower
if $min > $max { ($min, $max) = ($max, $min) }
say "Think of a number between $min and $max and I'll guess it!";
while $min <= $max {
my $guess = (($max + $min)/2).floor;
given lc prompt "My guess is $guess. Is your number higher, lower or equal (or quit)? (h/l/e/q)" {
when /^e/ { say "I knew it!"; exit }
when /^h/ { $min = $guess + 1 }
when /^l/ { $max = $guess }
when /^q/ { say "quiting"; exit }
default { say "WHAT!?!?!" }
}
}
say "How can your number be both higher and lower than $max?!?!?";
}
сообщение об использовании
кроме того, если ваши аргументы командной строки не соответствуют MAIN
подпись, вы получите полезное сообщение об использовании, по умолчанию. Обратите внимание, как комментарии подпрограмм и параметров начинаются с #=
умно включены в это сообщение об использовании:
./guess --help
Usage:
./guess -- Guessing game (defaults: min=0 and max=100)
./guess <max> -- Guessing game (min defaults to 0)
./guess <min> <max> -- Guessing game
<min> minimum of range of numbers to guess
<max> maximum of range of numbers to guess
здесь --help
не определенный параметр командной строки, тем самым вызывая это сообщение об использовании.
см. также
см. также в 2010 году и в Perl 6 сообщений календаря Адвента на MAIN
, пост разбор аргументов командной строки в Perl 6 и раздел синопсиса 6 О MAIN.