Perl - Références

Une référence Perl est un type de données scalaire qui contient l'emplacement d'une autre valeur qui peut être scalaire, des tableaux ou des hachages. En raison de sa nature scalaire, une référence peut être utilisée n'importe où, un scalaire peut être utilisé.

Vous pouvez créer des listes contenant des références à d'autres listes, qui peuvent contenir des références à des hachages, etc. C'est ainsi que les structures de données imbriquées sont construites en Perl.

Créer des références

Il est facile de créer une référence pour n'importe quelle variable, sous-programme ou valeur en la préfixant avec une barre oblique inverse comme suit -

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

Vous ne pouvez pas créer une référence sur un handle d'E / S (descripteur de fichier ou dirhandle) à l'aide de l'opérateur de barre oblique inverse, mais une référence à un tableau anonyme peut être créée en utilisant les crochets comme suit -

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

De la même manière, vous pouvez créer une référence à un hachage anonyme en utilisant les accolades comme suit -

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

Une référence à un sous-programme anonyme peut être créée en utilisant sub sans sous-nom comme suit -

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

Déréférencement

Le déréférencement renvoie la valeur d'un point de référence à l'emplacement. Pour déréférencer une référence, utilisez simplement $, @ ou% comme préfixe de la variable de référence selon que la référence pointe vers un scalaire, un tableau ou un hachage. Voici l'exemple pour expliquer le concept -

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

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

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

Si vous n'êtes pas sûr d'un type de variable, il est facile de connaître son type en utilisant ref, qui renvoie l'une des chaînes suivantes si son argument est une référence. Sinon, il renvoie faux -

SCALAR
ARRAY
HASH
CODE
GLOB
REF

Essayons l'exemple suivant -

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

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

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

Références circulaires

Une référence circulaire se produit lorsque deux références contiennent une référence l'une à l'autre. Il faut être prudent lors de la création de références sinon une référence circulaire peut entraîner des fuites de mémoire. Voici un exemple -

#!/usr/bin/perl

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

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

Value of foo is : REF(0x9aae38)

Références aux fonctions

Cela peut se produire si vous devez créer un gestionnaire de signaux afin de pouvoir produire une référence à une fonction en précédant ce nom de fonction avec \ & et pour déréférencer cette référence, il vous suffit de préfixer la variable de référence en utilisant une esperluette &. Voici un exemple -

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

Lorsque le programme ci-dessus est exécuté, il produit le résultat suivant -

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