Опубликован: 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 >
Аннотация: Рассматривается использование переменных внутри регулярных выражений, опасности, связанные с их применением, а также экранирование метасимволов, различие литералов и объектов регулярных выражений.

Как мы уже знаем, если регулярное выражение ограничено не апострофами, то перед его трансляцией производится интерполяция скалярных переменных $scalar и массивов @array. Символы % и & не являются метасимволами в регулярном выражении, поэтому хеши и результаты вызовов подпрограмм напрямую не интерполируются.

7.1 Интерполяция переменных и кода в строку

Сначала рассмотрим примеры интерполяции значений в строки, которые ограничены двойными кавычками. Аналогично интерполяция происходит в строки, ограниченные обратными кавычками: ``.

7.1.1. Интерполяция скаляра

Интерполяция в строку простого скаляра: "Text $name text". Если нет разделителя после имени переменной, то это имя надо взять в фигурные скобки: "Text ${name}text".

Интерполяция в строку переменной с индексами (элемента массива): "Text $name[1] text" или "Text $name[$ind] text". Аналогично происходит интерполяция элемента массива массивов:

my @a=([1,2],[3,4]);
$_="aaa$a[1][0]aaa";
print $_;

Будет напечатано:

aaa3aaa

7.1.2. Интерполяция массива

Массивы интерполируются всеми своими значениями:

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

На печати окажется

abc1 2 3 4def

Не проходит аналогичная интерполяция многомерного массива:

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

Напечатается

abcARRAY(0x224ea4) ARRAY(0x224f88)def

На самом деле в Perl нет многомерных массивов как в C или Pascal. @a является массивом из двух ссылок (размер массива @a равен двум). При его интерполяции выводятся эти две ссылки на два подмассива. Для интерполяции элементов массива надо подставлять массивы конечных элементов (не ссылок):

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

Напечатается

abc1 23 4def

Конструкция @{$a[0]} означает следующее: $a[0] является ссылкой на массив, а оператор @ ее разыменовывает, получая в результате сам этот массив.

При интерполяции массивов и при их выводе оператором print в качестве разделителя элементов массива используется значение специальной переменной $". По умолчанию это пробел. Но можно поменять это значение на другое:

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

На печать выйдет

abc1,2,3,4def

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