Сегодня перевел очередной кусочек спецификации Perl6::Perl5::Differences.
Perl6::Perl5::Differences - Отличия между Perl 5 и Perl 6
Блоки и Операторы
См. S04 если хотите узнать больше об операторах и блоках в Perl 6.
Не требуются скобки в управляющих структурах
Раньше: if ($a < $b) { ... } Теперь: if $a < $b { ... }
Аналогично для while, for, и.т.д. Можно использовать скобки,
но при этом придется соблюдать, чтобы был пробел после if, иначе
это будет вызовом подпрограммы.
Теперь try {} вместо eval {}.
Теперь вместо блока eval используется try.
Было: eval { # ... }; if ($@) { warn "ошибка: $@"; } Стало: try { # ... CATCH { warn "ошибка: $!" } }
CATCH обеспечивает больше гибкости в обработке ошибок. См. [S04]: "Обработчики исключений" для получения детальной информации.
foreach становится for
Раньше: foreach (@whatever) { ... } Теперь: for @whatever { ... }
Кроме того, изменился способ присвоения нечто другому, чем $_:
Было: foreach my $x (@whatever) { ... } Стало: for @whatever -> $x { ... }
Подобным образом можно извлекать несколько элементов одновременно:
Было: while (my($age, $sex, $location) = splice @whatever, 0, 3) { ... } Стало: for @whatever -> $age, $sex, $location { ... }
(За исключением того, что версия for не уничтожает массив)
В спецификациях [S04]: "Оператор for" и [S29]: each об этом говорится подробнее.
for становится loop
Было: for ($i = 0; $i < 10; $i++) { ... } Стало: loop ($i = 0; $i < 10; $i++) { ... }
Также loop можно использовать для создания бесконечных циклов:
Было: while (1) { ... } Стало: loop { ... }
Регулярные выражения и "правила"
В примере ниже иллюстрируется простая трансляция регулярного выражения Perl5 в Perl6:
Было: $str =~ m/^\d{2,5}\s/i Стало: $str ~~ m:P5:i/^\d{2,5}\s/
Здесь используется модификатор :P5. Так как стандартный синтаксис Perl6
достаточно разнообразный, 'P5' отмечает где необходима совместимость с синтаксисом Perl5. Для замены:
Было: $str =~ s/(a)/$1/e; Стало: $str ~~ s:P5/(a)/{$0}/;
Обратите внимание, что первый буфер захвата не $1, как было раньше, а $0,
а модификатор /e удален в пользу встроенной закрытой нотации.
Данная тема подробно рассматривается в спецификации S05. См. также:
Связанный с ним Апокалипсис (анг. Apocalypse), в котором объясняются изменения:
http://dev.perl.org/perl6/doc/design/apo/A05.html
И связанная с ним Экзегеза (анг. Exegesis), где данная тема объясняется более детально:
http://dev.perl.org/perl6/doc/design/exe/E05.html
Leave a comment