18. Функция MAIN в Perl 6

Сегодня мы рассмотрим функцию 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>

Если сегодня комментаторы не допишут еще интересностей про эту функцию, то поговорим об этом завтра.

2 thoughts on “18. Функция MAIN в Perl 6”

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *