En Perl, tous les arguments de fonction passent par le tableau @_. Lors de l'appel d'un sous-programme, tous les paramètres transmis se retrouvent à l'intérieur de ce tableau, et au départ — c'est une liste, pas une copie, c'est-à-dire que si vous changez $_[0], vous modifiez l'original.
sub foo { my ($arg1, $arg2) = @_; $arg1 = 10; # Seule la variable locale change }
sub bar { my ($array_ref) = @_; push @$array_ref, 42; } my @data = (1,2,3); bar(\@data); # @data est maintenant (1,2,3,42)
my ($a, $b) = @_, des copies sont créées.Si vous passez un tableau à une fonction en Perl comme ceci :
myfunc(@arr), et que vous accédez à$_[0]à l'intérieur de la fonction, que trouvera-t-on ?
Réponse correcte : Il y aura le premier élément de la valeur du tableau, et non une référence à tout le tableau ! Pour passer un tableau comme un objet unique, utilisez une référence : myfunc(\@arr).
sub print_first { print $_[0], " "; } my @a = qw/foo bar baz/; print_first(@a); # Affichera 'foo', pas une référence au tableau print_first(\@a); # Affichera ARRAY(0x...) — référence à tout le tableau
Histoire
update_hash(%global). À l'intérieur, $_[0] était modifié. En conséquence — seul un segment local du tableau d'arguments était modifié, et le hachage global n’était pas modifié. La solution correcte était de passer une référence : update_hash(\%global).Histoire
myfunc(@arr, %opts). Il s'est avéré qu'une partie des clés du hachage était remplacée par les valeurs du tableau, et il était difficile de détecter l'erreur.Histoire
Lors de la mise en œuvre d'un parcours récursif d'un arbre, nous souhaitions modifier les éléments internes. Les tableaux étaient passés "tel quel" à la fonction, pas par référence. Ils créaient des copies, les modifications n'avaient aucun impact sur le contexte externe. Le problème a été résolu en remplaçant les passages par un style de référence.