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" };

Разыменование

Разыменование можно выполнить с помощью $, @ или % в зависимости от типа, например:

Примеры

#!/usr/bin/perl $var = 10; # $r ссылается на скалярную переменную $var $r = \$var; # Вывести значение переменной, на которую ссылается $r print "$varis:", $$r, "\n"; @var = (1, 2, 3); # $r ссылается на массив @var $r = \@var; # Вывести значение переменной, на которую ссылается $r print "@var is:", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # $r ссылается на хеш %var $r = \%var; # Вывести значение переменной, на которую ссылается $r print "\%var is:", %$r, "\n";

Выполнение приведенного выше примера дает следующий результат:

10 为 : 10
1 2 3 为: 123
\%var 为 : key110key220

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

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Пример:

Примеры

#!/usr/bin/perl $var = 10; $r = \$var; print "Тип ссылки r:", ref($r), "\n"; @var = (1, 2, 3); $r = \@var; print "Тип ссылки r:", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var; print "Тип ссылки r:", ref($r), "\n";

Выполнение приведенного выше примера дает следующий результат:

r 的引用类型 : SCALAR
r 的引用类型 : ARRAY
r 的引用类型 : HASH

Циклические ссылки

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

Примеры

#!/usr/bin/perl my $foo = 100; $foo = \$foo; print "Значение foo: ", $$foo, "\n";

Выполнение приведенного выше примера дает следующий результат:

Value of foo is : REF(0x9aae38)

Ссылки на функции

Формат ссылки на функцию: \&

Формат вызова ссылки на функцию: & + имя созданной ссылки.

Пример:

Примеры

#!/usr/bin/perl # Определение функции sub PrintHash{ my (%hash) = @_; foreach $item (%hash){ print "Элементы:$item\n"; } } %hash = ('name' => 'example', 'age' => 3); # Создать ссылку на функцию $cref = \&PrintHash; # Вызвать функцию, используя ссылку &$cref(%hash);

Выполнение приведенного выше примера дает следующий результат:

元素 : age
元素 : 3
元素 : name
元素 : example
Другие расширения