19. Функция MAIN в Perl 6, часть 2

Вчера мы рассмотрели основные свойства функции 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

Окончание завтра.

One thought on “19. Функция MAIN в Perl 6, часть 2”

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

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