Perl - referencje

Odwołanie do Perla to skalarny typ danych, który przechowuje lokalizację innej wartości, która może być skalarna, tablice lub skróty. Ze względu na swój skalarny charakter odniesienie może być używane w dowolnym miejscu, można również użyć skalara.

Możesz tworzyć listy zawierające odwołania do innych list, które mogą zawierać odwołania do skrótów i tak dalej. Tak buduje się zagnieżdżone struktury danych w Perlu.

Utwórz odniesienia

Łatwo jest utworzyć odniesienie do dowolnej zmiennej, podprogramu lub wartości, poprzedzając je odwrotnym ukośnikiem w następujący sposób -

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

Nie można utworzyć odwołania do uchwytu I / O (uchwytu pliku lub uchwytu) przy użyciu operatora ukośnika odwrotnego, ale odwołanie do tablicy anonimowej można utworzyć za pomocą nawiasów kwadratowych w następujący sposób -

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

W podobny sposób możesz utworzyć odniesienie do anonimowego skrótu za pomocą nawiasów klamrowych w następujący sposób -

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

Odwołanie do anonimowego podprocedury można utworzyć za pomocą podprogramu bez nazwy podrzędnej w następujący sposób -

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

Dereferencing

Dereferencing zwraca wartość z punktu odniesienia do lokalizacji. Aby wyłuskać odniesienie, po prostu użyj $, @ lub% jako przedrostka zmiennej odniesienia, w zależności od tego, czy odniesienie wskazuje na wartość skalarną, tablicę czy hash. Poniżej znajduje się przykład wyjaśniający koncepcję -

#!/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";

Wykonanie powyższego programu daje następujący wynik -

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

Jeśli nie masz pewności co do typu zmiennej, możesz łatwo poznać jej typ za pomocą ref, która zwraca jeden z następujących ciągów, jeśli jego argument jest odwołaniem. W przeciwnym razie zwraca false -

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Wypróbujmy następujący przykład -

#!/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";

Wykonanie powyższego programu daje następujący wynik -

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

Odnośniki cykliczne

Odwołanie cykliczne występuje, gdy dwa odwołania zawierają wzajemne odwołanie. Podczas tworzenia referencji należy zachować ostrożność, w przeciwnym razie odwołanie cykliczne może prowadzić do wycieków pamięci. Oto przykład -

#!/usr/bin/perl

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

Wykonanie powyższego programu daje następujący wynik -

Value of foo is : REF(0x9aae38)

Odniesienia do funkcji

Może się tak zdarzyć, jeśli chcesz utworzyć procedurę obsługi sygnału, aby móc utworzyć odwołanie do funkcji, poprzedzając tę ​​nazwę funkcji znakiem \ &, a aby usunąć odwołanie, wystarczy poprzedzić zmienną odniesienia za pomocą znaku &. Oto przykład -

#!/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);

Wykonanie powyższego programu daje następujący wynik -

Item : name
Item : Tom
Item : age
Item : 19