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