Учебники

Perl — Ссылки

Ссылка Perl — это скалярный тип данных, который содержит местоположение другого значения, которое может быть скалярным, массивом или хэшем. Из-за своей скалярной природы, ссылка может использоваться везде, где можно использовать скаляр.

Вы можете создавать списки, содержащие ссылки на другие списки, которые могут содержать ссылки на хэши и т. Д. Вот как встроенные структуры данных строятся в Perl.

Создать ссылки

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

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*foo;

Вы не можете создать ссылку на дескриптор ввода / вывода (дескриптор файла или dirhandle), используя оператор обратной косой черты, но ссылку на анонимный массив можно создать с помощью квадратных скобок следующим образом:

 $arrayref = [1, 2, ['a', 'b', 'c']];

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

$hashref = {
   'Adam'  => 'Eve',
   'Clyde' => 'Bonnie',
};

Ссылка на анонимную подпрограмму может быть создана с использованием sub без имени:

$coderef = sub { print "Boink!\n" };

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

Разыменование возвращает значение из контрольной точки в местоположение. Для разыменования ссылки просто используйте $, @ или% в качестве префикса ссылочной переменной в зависимости от того, указывает ли ссылка на скаляр, массив или хэш. Ниже приведен пример для объяснения концепции:

Live Demo

#!/usr/bin/perl

$var = 10;

# Now $r has reference to $var scalar.
$r = \$var;

# Print value available at the location stored in $r.
print "Value of $var is : ", $$r, "\n";

@var = (1, 2, 3);
# Now $r has reference to @var array.
$r = \@var;
# Print values available at the location stored in $r.
print "Value of @var is : ",  @$r, "\n";

%var = ('key1' => 10, 'key2' => 20);
# Now $r has reference to %var hash.
$r = \%var;
# Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";

Когда вышеуказанная программа выполняется, она дает следующий результат —

Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110

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

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Давайте попробуем следующий пример —

Live Demo

#!/usr/bin/perl

$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n";

@var = (1, 2, 3);
$r = \@var;
print "Reference type in r : ", ref($r), "\n";

%var = ('key1' => 10, 'key2' => 20);
$r = \%var;
print "Reference type in r : ", ref($r), "\n";

Когда вышеуказанная программа выполняется, она дает следующий результат —

Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH

Циркулярные ссылки

Циркулярная ссылка возникает, когда две ссылки содержат ссылку друг на друга. При создании ссылок вы должны быть осторожны, иначе круговая ссылка может привести к утечкам памяти. Ниже приведен пример —

Live Demo

#!/usr/bin/perl

 my $foo = 100;
 $foo = \$foo;
 
 print "Value of foo is : ", $$foo, "\n";

Когда вышеуказанная программа выполняется, она дает следующий результат —

Value of foo is : REF(0x9aae38)

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

Это может произойти, если вам нужно создать обработчик сигнала, чтобы вы могли создать ссылку на функцию, поставив перед ней имя функции \ & и разыменовав эту ссылку, вам просто нужно добавить префикс ссылки к переменной с помощью амперсанда &. Ниже приведен пример —

Live Demo

#!/usr/bin/perl

# Function definition
sub PrintHash {
   my (%hash) = @_;
   
   foreach $item (%hash) {
      print "Item : $item\n";
   }
}
%hash = ('name' => 'Tom', 'age' => 19);

# Create a reference to above function.
$cref = \&PrintHash;

# Function call using reference.
&$cref(%hash);

Когда вышеуказанная программа выполняется, она дает следующий результат —