Perl: ссылки
Ссылка — это указатель. Ссылка Perl — это скалярный тип, который может указывать на переменные, массивы, хеши (также называемые ассоциативными массивами) и даже подпрограммы, и её можно использовать в любом месте программы.
Создание ссылок
При определении переменной поставьте \ перед именем переменной, чтобы получить ссылку на эту переменную, например:
$scalarref = \$foo; # 标量变量引用 $arrayref = \@ARGV; # 列表的引用 $hashref = \%ENV; # 哈希的引用 $coderef = \&handler; # 子过程引用 $globref = \*foo; # GLOB句柄引用
В массивах можно использовать ссылки на анонимные массивы, определяемые с помощью []:
$aref= [ 1,"foo",undef,13 ];
Элементы анонимного массива сами могут быть анонимными массивами, поэтому мы можем использовать этот метод для построения массивов массивов и массивов любой размерности.
my $aref = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
В хешах можно использовать анонимные ссылки на хеши, определяемые с помощью {}:
$href= { APR =>4, AUG =>8 };
Мы также можем создать ссылку на анонимную подпрограмму, не имеющую имени:
$coderef = sub { print "Example!\n" };
Разыменование
Разыменование можно выполнить с помощью $, @ или % в зависимости от типа, например:
Примеры
Выполнение приведенного выше примера дает следующий результат:
10 为 : 10 1 2 3 为: 123 \%var 为 : key110key220
Если вы не уверены в типе переменной, можно использоватьref, чтобы определить его. Возвращаемые значения следующие. Если ни одно из следующих значений не подходит, возвращается false:
SCALAR ARRAY HASH CODE GLOB REF
Пример:
Примеры
Выполнение приведенного выше примера дает следующий результат:
r 的引用类型 : SCALAR r 的引用类型 : ARRAY r 的引用类型 : HASH
Циклические ссылки
Циклические ссылки возникают, когда две ссылки содержат друг друга. Нужно использовать их осторожно, иначе это приведёт к утечкам памяти, как в следующем примере:
Примеры
Выполнение приведенного выше примера дает следующий результат:
Value of foo is : REF(0x9aae38)
Ссылки на функции
Формат ссылки на функцию: \&
Формат вызова ссылки на функцию: & + имя созданной ссылки.
Пример:
Примеры
Выполнение приведенного выше примера дает следующий результат:
元素 : age 元素 : 3 元素 : name 元素 : exampleДругие расширения