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