Регулярные выражения Perl и их применение
ba2f5a3f

Интерполяция кода Perl


В строку можно интерполировать результат выполнения кода Perl. Вот как работает функция join в предыдущем примере с интерполяцией массива значений:

my @a=([1,2],[3,4]); $_="abc${\(join ',',(@{$a[0]},@{$a[1]}))}def"; print $_;

Результат получается тем же:

abc1,2,3,4def

Конструкция \(join ',',(@{$a[0]},@{$a[1]}) обрабатывается как ссылка на анонимный список, элементы которого выдает функция join. Конструкция {…} выполняется как блок команд, она возвращает ссылку на этот анонимный список, которая оператором @ разыменовывается и получается сам список. Обратите внимание, что если бы мы внутри этой конструкции использовали ограничители строки ", то их надо было бы маскировать обратными слэшами:

my @a=([1,2],[3,4]); $_="abc${\(join \",\",(@{$a[0]},@{$a[1]}))}def"; print $_;

Этот пример можно переписать с использованием конструкции @{[ список ]}:

my @a=([1,2],[3,4]); $_="abc@{[join ',',(@{$a[0]},@{$a[1]})]}def"; print $_;

Результат тот же:

abc1,2,3,4def

Конструкция [ список ] является генератором анонимного массива, ссылка на который разыменовывается префиксом @.

Так же можно интерполировать результат выполнения собственной подпрограммы, но если эта подпрограмма объявлена после ее использования, то перед ее именем надо поставить разыменовывающий префикс &:

$_="abc${\(&subr('Bill'))}def"; print $_;

sub subr($) { return "Hello $_[0]!" }

На печати получим:

abcHello Bill!def

Аналогично, в строку можно интерполировать другие операторы Perl, например:

my $a=3; $_="abc${\($a == 3 ? '$a == 3' : '$a != 3')}def"; print $_;

Получаем:

abc$a == 3def

Здесь обратите внимание на то, что хотя код интерполируется в строку, ограниченную двойными кавычками, маскировать $ внутри апострофов не надо, т.к. они обрабатываются внутри кода Perl. В ином случае внутри строки, ограниченной двойными кавычками, надо было бы маскировать $ и @, даже если бы они были внутри своей строки, заключенной в апострофы.



Содержание раздела