Интерполяция переменных и метасимволы \U, \u, \L, \l, \Q, \E
Как мы уже знаем, если регулярное выражение ограничено не апострофами, то перед его трансляцией производится интерполяция скалярных переменных $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