Интерполяция переменных и метасимволы \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. В ином случае внутри строки, ограниченной двойными кавычками, надо было бы маскировать $ и @, даже если бы они были внутри своей строки, заключенной в апострофы.