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',
};
Ссылка на анонимную подпрограмму может быть создана с помощью подпрограммы без имени, как показано ниже:
$coderef = sub { print "Boink!\n" };
Разыменование
Разыменование возвращает значение от опорной точки на месте. Чтобы разыменовать ссылку, просто используйте $, @ или% в качестве префикса ссылочной переменной в зависимости от того, указывает ли ссылка на скаляр, массив или хэш. Ниже приведен пример, объясняющий концепцию -
#!/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
Давайте попробуем следующий пример -
#!/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
Циркулярные ссылки
Циклическая ссылка возникает, когда две ссылки содержат ссылку друг на друга. Будьте осторожны при создании ссылок, иначе циклическая ссылка может привести к утечке памяти. Ниже приведен пример -
#!/usr/bin/perl
my $foo = 100;
$foo = \$foo;
print "Value of foo is : ", $$foo, "\n";
Когда вышеуказанная программа выполняется, она дает следующий результат -
Value of foo is : REF(0x9aae38)
Ссылки на функции
Это может произойти, если вам нужно создать обработчик сигнала, чтобы вы могли создать ссылку на функцию, указав перед именем функции с помощью \ &, а для разыменования этой ссылки вам просто нужно префикс ссылочной переменной с помощью амперсанда &. Ниже приведен пример -
#!/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);
Когда вышеуказанная программа выполняется, она дает следующий результат -
Item : name
Item : Tom
Item : age
Item : 19