Интерполяция переменных и метасимволы \U, \u, \L, \l, \Q, \E
7.1.3. Интерполяция вызова подпрограммы, возвращающей ссылку
Вот пример интерполяции результата вызова подпрограммы, которая возвращает ссылку:
#!/usr/bin/perl -w use strict; no strict 'refs'; sub subr() { return 'abc' } our $abc=123; $_="${&subr}"; print $_;
На печать выходит 123.
Здесь используется разыменование именной ссылки abc, поэтому переменная $abc должна быть глобальной, т.к. имена переменных my не находятся в глобальной таблице имен typeglob. Кроме того, если вы применяете директиву use strict, то надо разрешить разыменование именных ссылок: no strict 'refs'.
Подпрограмма subr возвращает строку abc, которая является именем переменной.
Конструкция ${&subr} разыменовывает эту ссылку и возвращает значение переменной $abc. Задавая разные значения переменной $abc или разные возвращаемые подпрограммой subr значения, будем получать разные результаты интерполяции.
Здесь обратите внимание на разыменовывающий префикс & перед именем подпрограммы.
Он здесь всегда обязателен. Этот способ интерполяции годится только для написанных вами подпрограмм.
7.1.4. Интерполяция кода 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. В ином случае внутри строки, ограниченной двойными кавычками, надо было бы маскировать $ и @, даже если бы они были внутри своей строки, заключенной в апострофы.