Ссылка 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" };
Разыменование
Разыменование возвращает значение из контрольной точки в местоположение. Для разыменования ссылки просто используйте $, @ или% в качестве префикса ссылочной переменной в зависимости от того, указывает ли ссылка на скаляр, массив или хэш. Ниже приведен пример для объяснения концепции:
#!/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);
Когда вышеуказанная программа выполняется, она дает следующий результат —