Вчера мы рассмотрели основные свойства функции MAIN. Сегодня коснемся чуть более сложных деталей.
Начнем с простой программы, похожей на ту, что мы видели вчера:
say 1; sub MAIN() { say 'MAIN' } say 2;
Несмотря на то, что инструкции печати расположены и до, и после MAIN, обе они будут выполнены до нее:
$ perl6 main-2.pl 1 2 MAIN
Здесь нет ничего нового: в любой программе на перле можно создать функцию прямо по ходу дела, и она не повлияет на процесс выполнения.
Модификация @*ARGS
Код, расположенный за пределами MAIN, может изменять значения аргументов командной строки перед тем, как функция их получит. Например:
@*ARGS[0] = '10'; sub MAIN($x, $y) { say $x + $y }
При запуске этой программы $x всегда будет 10:
$ perl6 main-3.pl 3 4 14
Типизированные аргументы
Сигнатура функции позволяет накладывать дополнительные ограничения на тип принимаемых аргументов:
sub MAIN(Int) { say 'An integer' }
Попытка передать строку будет пресечена:
$ perl6 main-4.pl 43 An integer $ perl6 main-4.pl abc Usage: main-4.pl <Int>
Эту особенность можно использовать и в мультифункциях, хотя поскольку аргументы командной строки — строки, могут возникнуть конфузы, например, как в следующей программе:
multi sub MAIN(Int) { say 'An integer' } multi sub MAIN(Str) { say 'A string' }
Со строкой проблем нет, но целое число почему-то не будет принято:
$ perl6 main-5.pl abc A string $ perl6 main-5.pl 42 Ambiguous call to 'MAIN'; these signatures all match: :(Int $) :(Str $) in block <unit> at main-5.pl line 5
Окончание завтра.
Если заменить Int на IntStr, то последняя программа работает.