Que pourrait signifier la ligne suivante?
my $x = shift;
shift()
est un sous-programme Perl intégré qui prend un tableau comme argument, puis retourne et supprime le premier élément de ce tableau. Il est courant d’obtenir tous les parameters passés dans un sous-programme avec shift
appels de shift
. Par exemple, disons que vous avez un sous-programme foo
qui prend trois arguments. L’une des façons d’atsortingbuer ces parameters aux variables locales consiste à utiliser le shift
comme suit:
sub foo() { my $x = shift; my $y = shift; my $z = shift; # do something }
La confusion ici est qu’il semble que shift n’est pas passé en tant qu’argument. En fait, le tableau “default” est implicitement passé, c’est-à-dire @_
dans un sous-programme ou @ARGV
dehors d’un sous-programme.
La fonction shift
supprime le premier élément d’un tableau et le renvoie. Le tableau est raccourci d’un élément.
Le tableau par défaut (s’il n’y en a pas un en paramètre) est @_
si vous êtes dans une fonction, ou @ARGV
si vous êtes à scope de fichier.
Donc, dans ce cas, $x
est défini sur le premier paramètre de fonction ou sur le premier paramètre de ligne de commande.
En Perl, de nombreuses méthodes utilisent les variables par défaut ( $_
et @_
) si vous ne spécifiez pas explicitement d’arguments. Votre code est identique à:
my $x = shift @_;
Comme indiqué par PullMonkey plus tôt, dans une sous-routine, @_
contient les arguments transmis à cette sous-routine (comme décrit dans perlsub
). shift
supprimera la première valeur d’argument de @_
et la stockera dans $x
, donc $_[0]
vous donnera maintenant le deuxième argument passé à votre sous-routine.
Ceci est généralement un idiome pour: $ x est une variable locale affectée au premier paramètre passé au sous-programme, bien que.
my ($x) = @_;
est probablement plus clair (et ne modifie pas la liste des arguments).
dans un langage de profane, à partir d’un affichage très haut niveau, shift prend le premier élément d’un tableau (la partie la plus à gauche), tandis que l’opposé est le pop qui prend le dernier élément du tableau (la partie la plus à droite).
my @ array1 = (5,6,7,8,9); mon $ x = shift @ array1; imprimer "$ x \ n"; # 5 imprimer "@ array1 \ n"; # 6 7 8 9
Si vous êtes dans un sous-programme, cette ligne se shift
sur @_
(les parameters transmis).
Donc, $x
serait le premier élément @_
tableau @_
.
Donc, normalement, vous $x = shift if @_;