Чтение онлайн

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

my $ref2literal = \'Литерал'; # ссылка на литерал

my $ref2expression = \($n1*$n2); # ссылка на выражение

Анонимные данные - это значения, не связанные ни с одной переменной, доступ к которым происходит только по ссылке. Ссылка всегда указывает на значение конкретного типа: скаляр, массив, хэш, подпрограмму (или элемент таблицы символов, о которых речи пока не было). На какой именно тип объекта указывает ссылка, можно узнать с помощью функции ref, которая возвращает строку, описывающую тип значения объекта ссылки. Например:

print ref($ref2scalar); #
выведет: 'SCALAR'

А что получится, если вывести значение самой ссылки? Ее значение будет преобразовано в строку, содержащую тип объекта ссылки и его адрес в виде шестнадцатиричного числа, например:

print $ref2scalar; # выведет, например: 'SCALAR(0x335b04)'

Обратно преобразовать в ссылку это строковое представление адреса не удастся.

Чтобы получить доступ к значению, на которое указывает ссылка, нужно выполнить разыменование ссылки (dereference). Для этого переменная, содержащая ссылку, заключается в фигурные скобки и перед ней ставится нужный разыменовывающий префикс: $ для скаляра, @ для массива, % для хэша, & для подпрограммы. (Другими словами, после разыменовывающего префикса, определяющего тип хранящегося в переменной значения, вместо имени переменной записывается содержащая ссылку переменная или выражение, возвращающее ссылку.) Если не возникает неоднозначности в интерпретации выражения, то переменную, хранящую ссылку, в фигурные скобки можно не заключать. Вот примеры разыменования ссылок на скалярные значения:

print "${$ref2scalar} "; # или: $$ref2scalar

print "${$ref2literal} "; # или: $$ref2literal

print "${$ref2expression} "; # или: $$ref2expression

Значение скалярной переменной при доступе по ссылке, естественно, может изменяться, но попытка с помощью ссылки изменить литерал вызовет ошибку при выполнении программы ("Modification of a read-only value attempted"):

${$ref2scalar} = 'Новый скаляр'; # вполне законно

${$ref2literal} = 'Новый литерал'; # ОШИБКА!!!

Когда на какое-то значение ссылается несколько ссылочных переменных, то обращаться к этому значению можно с помощью любой из них. Значение доступно до тех пор, пока на него имеется хотя бы одна ссылка. Например:

my $ref2scalar = \$scalar; # ссылка на скаляр

my $one_more_ref = $ref2scalar; # копия ссылки на скаляр

# будет выведено одно и то же значение $scalar:

print "${$ref2scalar} ${$one_more_ref}";

На рис. 11.2 показана ситуация, когда несколько ссылок указывают на одну скалярную переменную.

Рис. 11.2.Несколько ссылок на скаляр

Если переменная $ref2scalar перестанет ссылаться на $scalar (например, после undef $ref2scalar), то значение $scalar

все еще будет доступно через переменную $one_more_ref.

Значением объекта ссылки также может быть ссылка (косвенная ссылка) на другой объект, возможно, тоже на ссылку. Ссылка даже может содержать ссылку на саму себя! Таким образом при необходимости можно построить цепочку ссылок любой длины. Например:

$value = 'Полезное значение';

$ref1 = \$value; # ссылка на значение

$ref2 = \$ref1; # ссылка на ссылку на значение

$ref3 = \$ref2; # ссылка на ссылку на ссылку на значение

Можно организовать многоуровневые косвенные ссылки без использования промежуточных переменных, несколько раз применяя операцию взятия ссылки на значение. Например, создадим такую цепочку ссылок:

$ref_chain = \\\$value; # цепочка из трех ссылок

Для доступа по такой цепочке ссылок к исходному значению правило разыменования применяется нужное число раз. Например, в цепочке из трех ссылок с помощью трех префиксов $ мы последовательно получаем доступ к ссылочным переменным, а еще один префикс нужен для доступа к полезному значению:

# выведем исходное значение через $ref3:

print ${${${$ref3}}}; # или короче: print $$$$ref3;

# или через $ref_chain:

print $$$$ref_chain;

Если применить функцию ref к переменной, содержащей ссылку на другой объект, то она вернет строку 'REF'. Если преобразовать в строку значение ссылки на ссылку, то будут выведено обозначение ссылочного типа и адрес объекта ссылки, например:

print ref($ref_chain); # выведет: 'REF'

print $ref_chain; # выведет, например: 'REF(0x334e8c)'

Подобным же образом можно работать со ссылками на массивы. Ссылка на переменную типа "массив" также создается с помощью операции взятия ссылки:

my @array = ('Это', 'список', 'в', 'массиве');

my $ref2array = \@array; # ссылка на массив

Если обращение к массиву будет происходить только по ссылке, то можно обойтись без переменной типа "массив", а создать анонимный массив и присвоить ссылку на него в скалярную переменную. Ссылка на анонимный массив создается с помощью квадратных скобок, в которые заключается список начальных значений безымянного массива:

my $ref2anon = [ # ссылка на анонимный массив

'Это', 'анонимный', 'массив'

]; # конец присваивания ссылки

my $ref2empty = []; # ссылка на пустой анонимный массив

Анонимные массивы удобно использовать для создания ссылки на копию массива. Для этого существующий массив помещается в квадратные скобки, и его значение будет скопировано в созданный анонимный массив:

my $ref2copy = [@array]; # ссылка на копию массива

Поделиться:
Популярные книги

Освобождение

Лейк Кери
Любовные романы:
современные любовные романы
эро литература
4.75
рейтинг книги
Освобождение

Все шедевры мировой литературы в кратком изложении.Сюжеты и характеры.Зарубежная литература XVII-XVIII веков

Воробьева Н. К.
Справочная литература:
энциклопедии
5.00
рейтинг книги
Все шедевры мировой литературы в кратком изложении.Сюжеты и характеры.Зарубежная литература XVII-XVIII веков

Пока едет «Скорая». Рассказы, которые могут спасти вашу жизнь

Звонков Андрей Леонидович
Проза:
современная проза
7.50
рейтинг книги
Пока едет «Скорая». Рассказы, которые могут спасти вашу жизнь

Современный зарубежный детектив-23. Компиляция. Книги 1-18

Коллектив авторов
Современный зарубежный детектив
Детективы:
триллеры
классические детективы
криминальные детективы
шпионские детективы
5.00
рейтинг книги
Современный зарубежный детектив-23. Компиляция. Книги 1-18

Избранное. Компиляция. Книги 1-11

Пулман Филип
Фантастика:
фэнтези
героическая фантастика
5.00
рейтинг книги
Избранное. Компиляция. Книги 1-11

Звезды на приеме у психолога. Психоанализ знаменитых личностей

Гарифуллин Рамиль Рамзиевич
Научно-образовательная:
психология
5.00
рейтинг книги
Звезды на приеме у психолога. Психоанализ знаменитых личностей

Вавилон - 17 [Вавилон - 17. Нова. Падение башен]

Дилэни Сэмюэль
Фантастика:
научная фантастика
5.00
рейтинг книги
Вавилон - 17 [Вавилон - 17. Нова. Падение башен]

Уроки Истории для России

Северский Виктор
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Уроки Истории для России

Ермак. Регент

Валериев Игорь
10. Ермак
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Ермак. Регент

Библиотека литературы США

Портер Кэтрин Энн
Проза:
современная проза
5.00
рейтинг книги
Библиотека литературы США

Толковый словарь психиатрических терминов

Крук Инна Вадимовна
Научно-образовательная:
психология
6.25
рейтинг книги
Толковый словарь психиатрических терминов

Четвертый крестовый поход

Филипс Джонатан
Историческая библиотека
Фантастика:
альтернативная история
5.00
рейтинг книги
Четвертый крестовый поход

Электроника?.. Нет ничего проще!

Эймишен Жан-Поль
885. Массовая радиобиблиотека
Техника:
радиоэлектроника
5.00
рейтинг книги
Электроника?.. Нет ничего проще!

Оперативная деятельность и вопросы конспирации в работе спецслужб Т. 3

Ивахин Анатолий Евгеньевич
Документальная литература:
прочая документальная литература
5.00
рейтинг книги
Оперативная деятельность и вопросы конспирации в работе спецслужб Т. 3