Взаимодействие с командной строкой perl 6 из функции MAIN

https://perl6advent.wordpress.com/2010/12/02/day-2-interacting-with-the-command-line-with-main-subs/
  • Перевод
В Unix-среде множество скриптов получают аргументы из командной строки. В Perl 6 обрабатывать их очень просто:

    $ cat add.pl

    sub MAIN($x, $y) {
        say $x + $y
    }

    $ perl6 add.pl 3 4
    7
    $ perl6 add.pl too many arguments
    Usage:
    add.pl x y


Просто создав функцию MAIN и задав ей сигнатуру из параметров, вы автоматически получаете парсер командной строки, который передаёт их в аргументы функции $x и $y, и сообщение о правильном вызове скрипта.

Это сообщение можно настроить, добавив дополнительную функцию USAGE:

    $ cat add2.pl

    sub MAIN($x, $y) {
        say $x + $y
    }
    sub USAGE() {
        say "Использование: add.pl <num1> <num2>";
    }

    $ perl6 add2.pl too many arguments
    Использование: add.pl <num1> <num2>


Объявив функцию MAIN как multi, можно задать альтернативный синтаксис или использование синтаксиса в зависимости от значения константы:

    $ cat calc

    #!/usr/bin/env perl6
    multi MAIN('add', $x, $y)  { say $x + $y }
    multi MAIN('div', $x, $y)  { say $x / $y }
    multi MAIN('mult', $x, $y) { say $x * $y }

    $ ./calc add 3 5
    8
    $ ./calc mult 3 5
    15
    $ ./calc
    Usage:
    ./calc add x y
    or
    ./calc div x y
    or
    ./calc mult x y


Именованные параметры соответствуют опциям:

    $ cat copy.pl

    sub MAIN($source, $target, Bool :$verbose) {
        say "Копируем '$source' в '$target'" if $verbose;
        run "cp $source $target";
    }

    $ perl6 copy.pl calc calc2
    $ perl6 copy.pl  --verbose calc calc2
    Копируем 'calc' to 'calc2'


Объявление параметра как Bool отменяет передачу в него значения. Если бы ограничения типа Bool не было, значение было бы передано в него:

    $ cat do-nothing.pl

    sub MAIN(:$how = 'быстро') {
        say "Ничего не делай, но делай это $how";
    }

    $ perl6 do-nothing.pl
    Ничего не делай, но делай это быстро
    $ perl6 do-nothing.pl --how=хорошо
    Ничего не делай, но делай это хорошо
    $ perl6 do-nothing.pl what?
    Usage:
    do-nothing.pl [--how=value-of-how]


В общем, Perl 6 предоставляет встроенные возможности парсера командной строки и выдачи сообщений о правильном использовании программы, когда вы просто объявляете специальные функции и их сигнатуры.
  • +10
  • 4,1k
  • 3
Поделиться публикацией

Похожие публикации

Комментарии 3

    0
    Жалко, что, судя по комментариям к оригинальной заметке, не поддерживаются другие типы параметров (кроме Bool). Было бы круто, если б можно было объявить параметр численным, например.
      0
      По первым ощущениям GetOpt:: и даже прочие типа Getopt:: пока выглядят привлекательней…
        0
        Весьма неплохо, для простых скриптов должно быть очень удобно. Для остального — есть docopt.

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое