Perl - Riferimenti

Un riferimento Perl è un tipo di dati scalare che contiene la posizione di un altro valore che potrebbe essere scalare, array o hash. A causa della sua natura scalare, un riferimento può essere utilizzato ovunque, uno scalare può essere utilizzato.

È possibile costruire elenchi contenenti riferimenti ad altri elenchi, che possono contenere riferimenti ad hash e così via. Questo è il modo in cui le strutture dati annidate sono costruite in Perl.

Crea riferimenti

È facile creare un riferimento per qualsiasi variabile, subroutine o valore anteponendolo con una barra rovesciata come segue:

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

Non è possibile creare un riferimento su un handle I / O (filehandle o dirhandle) utilizzando l'operatore backslash ma è possibile creare un riferimento a un array anonimo utilizzando le parentesi quadre come segue:

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

In modo simile puoi creare un riferimento a un hash anonimo usando le parentesi graffe come segue:

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

È possibile creare un riferimento a una subroutine anonima utilizzando sub senza un nome secondario come segue:

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

Dereferenziazione

Dereferencing restituisce il valore da un punto di riferimento alla posizione. Per dereferenziare un riferimento è sufficiente utilizzare $, @ o% come prefisso della variabile di riferimento a seconda che il riferimento punti a uno scalare, un array o un hash. Di seguito è riportato l'esempio per spiegare il concetto:

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

Quando il programma sopra viene eseguito, produce il seguente risultato:

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

Se non sei sicuro di un tipo di variabile, è facile conoscerne il tipo usando ref, che restituisce una delle seguenti stringhe se il suo argomento è un riferimento. Altrimenti, restituisce false -

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Proviamo il seguente esempio:

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

Quando il programma sopra viene eseguito, produce il seguente risultato:

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

Riferimenti circolari

Un riferimento circolare si verifica quando due riferimenti contengono un riferimento reciproco. Devi stare attento durante la creazione dei riferimenti altrimenti un riferimento circolare può portare a perdite di memoria. Di seguito è riportato un esempio:

#!/usr/bin/perl

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

Quando il programma sopra viene eseguito, produce il seguente risultato:

Value of foo is : REF(0x9aae38)

Riferimenti a funzioni

Ciò potrebbe accadere se è necessario creare un gestore di segnali in modo da poter produrre un riferimento a una funzione facendo precedere il nome della funzione con \ & e per dereferenziare quel riferimento è sufficiente aggiungere un prefisso alla variabile di riferimento utilizzando la e commerciale &. Di seguito è riportato un esempio:

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

Quando il programma sopra viene eseguito, produce il seguente risultato:

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