Новое в Perl 5.14 — модификатор r

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.

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

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

Retype the CAPTCHA code from the image
Change the CAPTCHA codeSpeak the CAPTCHA code