Опубликован: 18.06.2007 | Доступ: свободный | Студентов: 1354 / 35 | Оценка: 4.14 / 3.29 | Длительность: 12:44:00
ISBN: 978-5-94774-604-4
Лекция 7:

Интерполяция переменных и метасимволы \U, \u, \L, \l, \Q, \E

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >

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

< Лекция 6 || Лекция 7: 123456 || Лекция 8 >
Константин Бражников
Константин Бражников
Россия
Mike .
Mike .
Россия