В 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 предоставляет встроенные возможности парсера командной строки и выдачи сообщений о правильном использовании программы, когда вы просто объявляете специальные функции и их сигнатуры.
ссылка на оригинал статьи http://habrahabr.ru/post/252451/
Добавить комментарий