20 апреля вышла предварительная версия Perl 5.14 — perl-5.14.0-RC1. Если за неделю не найдется страшных багов, то дистрибутив почти один в один станет очередной стабильной версией.
В этой серии публикаций будут рассмотрены новые возможности языка.
Модификатор r
Оператор замены s получил новый модификатор r, который предписывает возвратить результат замены, не изменяя оригинальную строку:
use v5.14; my $version = "Perl 5.10"; say $version =~ s/5\.10/5.14/r; # На печати: Perl 5.14
Выделенный фрагмент делает запрошенную замену, но не изменяет прежнее значение переменной $version
.
Использовать результат замены нужно с осторожностью, помня, что отсутствие модификатора r
полностью меняет семантику оператора.
my $newversion = $version =~ s/5\.10/5.14/r; my $count = $version =~ s/5\.10/5.14/;
В первом случае $newversion получит новое значение с заменой: Perl 5.14, а во втором — переменная $count
лишь сообщит о совершенной замене. Оригинальное значение сохранится только при наличии r
.
Пример 1
use v5.14; use utf8; use open qw(:std :utf8); my $old = "Погода в Ленинграде"; my $new = $old =~ s/Ленинград/Санкт-Петербург/r; say $old; say $new;
$ perl s.pl
Погода в Ленинграде
Погода в Санкт-Петербурге
Пример 2
use v5.14; use utf8; use open qw(:std :utf8); my $old = "Погода в Ленинграде"; my $new = $old =~ s/Ленинград/Санкт-Петербург/; say $old; say $new;
$ perl s.pl
Погода в Санкт-Петербурге
1
Модификатор r
дает важное преимущество: теперь замену можно производить на неизменяемых литеральных строках, не создавая промежуточные переменные:
say "в Украину" =~ s/в/на/r;
Аналогичное действие модификтор r
оказывает и на работу операторов подстановки tr
и y
:
my $their_language = 'ruby';
my $language = $their_language =~ tr/bruy/rpel/r;
say $language; # perl
Кстати, стоит напомнить, что начиная с Perl 5.12 указание версии (use v5.14) автоматически включает и режим strict.