Сегодня мы рассмотрим функцию MAIN. Известно, что в скриптовых языках такой функции обычно нет. В Perl 6 она есть, но не обязательна. Если же она есть, то она будет выполнена 🙂
sub MAIN() { say 'Hello, World!'; }
Эта программа вполне себе будет работать, но в данном случае обертывать инструкции в функцию особого смысла нет.
Давайте посмотрим, что произойдет, если добавить какие-то действия вне MAIN:
say 'Hi'; sub MAIN() { say 'Hello, World!'; }
Будут напечатаны обе строки:
$ ./perl6 MAIN.pl Hi Hello, World!
Аргументы MAIN
Самое интересное происходит, если этой функции указать аргументы. Начнем с простого:
sub MAIN($x) { say $x; }
Запускаем и видим, что вместо результата (какого?) программа печатает пример использования:
$ perl6 MAIN.pl Usage: MAIN.pl <x>
Программа ожидает аргумента в командной строке. Этот аргумент будет передан в переменную $x:
$ perl6 MAIN.pl 42 42
Если указать два параметра, то мы вновь получим сообщение об ошибке, поскольку Perl 6 будет проверять сигнатуру функции MAIN, которая требует только одного аргумента.
А дальше можно применить общие знания о том, как работают сигнатуры в Perl 6. Во-первых, функции могут принимать именованные аргументы. Во-вторых, различие сигнатур делает возможным мультифункции.
Пример с именованными параметрами:
sub MAIN(:$value, :$power) { say $value ** $power; }
Эта программа работает так:
$ perl6 MAIN.pl --value=42 --power=3 74088
Пробуем мультифункции:
multi sub MAIN($a) { say "[$a]"; } multi sub MAIN($a, $b) { say "[$a and $b]"; }
В зависимости от числа переданных в командной строке величин, будет вызван один из двух кандидатов.
$ perl6 MAIN.pl 42 [42] $ perl6 MAIN.pl 42 43 [42 and 43]
Интересно, что пример использования в этом случае показывает два варианта:
$ perl6 MAIN.pl Usage: MAIN.pl <a> MAIN.pl <a> <b>
Если сегодня комментаторы не допишут еще интересностей про эту функцию, то поговорим об этом завтра.
Молчу молчу