Подтвердить что ты не робот

Как анализировать и проверять аргументы командной строки в 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 arguments\n");

say $length;
say $data;
say $verbose;

Здесь =i в "length=i" создает ограничение числового типа для значения, связанного с --length и =s в "file=s", создает аналогичное ограничение типа строки.

Как мне сделать что-то подобное в Perl 6?

4b9b3361

Ответ 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 является общим 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 также может использоваться с позиционными аргументами. Например, вот Угадай число (из кода Розетты). По умолчанию используется минимум 0 и максимум 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 не является определенным параметром командной строки, таким образом вызывая это сообщение об использовании.

Смотрите также

См. Также публикации календаря появлений Perl 6 2010, 2014 и 2018 годов в MAIN, аргументы командной строки post Parsing в Perl 6 и раздел Synopsis 6 о MAIN.

Ответ 2

В качестве альтернативы, есть также Getopt :: Long для perl6. Ваша программа работает в нем практически без изменений:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
get-options("length=i" => $length,    # numeric
            "file=s"   => $data,      # string
            "verbose"  => $verbose);  # flag

say $length;
say $data;
say $verbose;