PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 51


1.8. Расширение переменных во входных данных

Проблема

Имеется строка, внутри которой присутствует ссылка на переменную: You owe $debt to me Требуется заменить имя переменной $debt в строке ее текущим значением.

Решение

Если все переменные являются глобальными, воспользуйтесь подстановкой с сим­волическими ссылками:

$text  =~s/\$(\w+)/${$1}/g,

Но если среди переменных могут встречаться лексические (ту) переменные, сле­дует использовать /ее:

Stext =~ s/(\$\w+)/$1/gee,

Комментарий

Первый способ фактически сводится к следующему: мы ищем нечто похожее на имя переменной, а затем интерполируем ее значение посредством символическо­го разыменования (dereferencing). Если $1 содержит строку somevar, то ${$1} бу­дет равно содержимому Ssomevar. Такой вариант не будет работать при действую-


42   Глава 1 • Строки

щей директиве use st net    ref s', потому что она запрещает символическое разы­менование.

Приведем пример:

use vars qw($rows $cols);

no strict 'refs',    # для приведенного ниже ${$1}

my $text;

($rows, $cols) = (24, 80);

$text = q(I am $ rows high and $cols long); # апострофы'

$text =- s/\$(\w+)/${$1}/g;

print $text,

1  am 24  high  and  80 long

Возможно, вам уже приходилось видеть, как модификатор подстановки /е ис­пользуется для вычисления заменяющего выражения, а не строки. Допустим, вам потребовалось удвоить каждое целое число в строке:

$text = ' I am 17 years old'; $text =- s/(\d+)/2 * $1/eg;

Перед запуском программы, встречая /е при подстановке, Perl компилирует код заменяющего выражения вместе с остальной программой, задолго до фактической подстановки. При выполнении подстановки $1 заменяется найденной строкой. В нашем примере будет вычислено следующее выражение:

2  *  17

Но если попытаться выполнить следующий фрагмент:

$text =   'I am $AGE years old';     # Обратите внимание на апострофы1
$text =~ s/(\$\w+)/$1/eg;             # НЕВЕРНО

при условии, что $text содержит имя переменной $AGE, Per] послушно заменит $1 на $AGE и вычислит следующее выражение:




Начало  Назад  Вперед



Книжный магазин