21 марта на CPAN появился релиз-кандидат Perl 5.12. 29 марта — RC1. Еще через неделю пора ставить 5.12 в продакшн :-)
strict по умолчанию
Явное указание use v5.12 неявно делает активным strict.
Например, программа
use v5.10;
say $x;
отработает без ошибок, а похожая, но с явно упомянутой версией 5.12 (если быть точным, то более 5.11), уже не скомпилируется:
use v5.12;
say $x;
Global symbol "$x" requires explicit package name at 2.pl line 3.
Execution of 2.pl aborted due to compilation errors.
Версии модулей
В Perl 5.12 возможно указывать версию модуля одновременно с его именем, избавляясь от переменной $VERSION:
package Earth::Gravity 9.8;
sub g {
return 9.8;
}
1;
Аналогичный синтаксис в директиве use работает по-прежнему, позволяя указывать минимально необходимую версию:
use v5.12;
use Earth::Gravity 9.8;
say g();
Важно помнить, что таким образом невозможно выбрать модуль конкретной версии, если в наличии есть несколько.
Например, если в каталоге lib лежит модуль Earth::Gravity 9.81, то успех будет зависеть от порядка просмотра каталогов:
$ perl5.12.0 -I. -Ilib test.pl
Earth::Gravity version 9.81 required--this is only version 9.8 at 2.pl line 3.
BEGIN failed--compilation aborted at 2.pl line 3.
$ perl5.12.0 -Ilib -I. test.pl 9.81
Номер версии по-прежнему доступен через переменную $VERSION, даже если она не была инициализирована явно:
$ perl5.12.0 -mEarth::Gravity -E'say $Earth::Gravity::VERSION' 9.8
Оператор Yada Yada (...)
(Еще один вопрос для собеседования :-)
Оператор ... создан для того, чтобы поставить временную заглушку вместо кода, который еще не написан. Perl разрешает компилировать код с этими точками, но запрещает выполнять его.
При попытке выполнить код, содержащий Yada Yada, возникнет ошибка (времени исполнения):
use v5.12;
sub calculate_salary {
...;
}
say 'before';
calculate_salary;
say 'after';
$ perl5.12.0 test.pl
before
Unimplemented at test.pl line 4.
Yada Yada правильно распознается только в том случае, если использовано в конструкции, подразумевающим законченное выражение. В остальных случаях ... может быть распознан как один из вариантов оператора диапазона.
Правильное использование:
sub calculate_salary {
...;
}
Неправильное использование (вызовет ошибку при компилировании):
say base_salary + ...;
Метасимвол \N в регулярных выражениях
Метасимвол \N совпадает со всеми символами, кроме перевода строки \n, причем независимо от наличия модификатора /s.
use v5.12;
"abc\ndef" ~~ /(\N+)/;
say $1; # abc
"abc\ndef" ~~ /(\N+)/s;
say $1; # abc
В этом значении метосимвол является экспериментальным; в частности, из-за возможных конфликтов в использовании с именованными символами, которые прагма charnames делает доступными с помощью очень похожиго синтаксиса: \N{GREEK SMALL LETTER PI}, в то время как повторы нескольких символов \N может быть записан с помощью стандартного квантификатора: \N{5}.
См. также Новое в Perl 5.12 — Часть II
Ты лапочка :)
Fix pls "Аналогичный синтаксив"
Яда! Яда!
Так же фикс /то в зависимости успех будет зависеть/успех будет зависеть/