Que pourrait signifier la ligne suivante?
my $x = shift;
shift()
est un sous-programme Perl intégré qui prend un tableau en argument, puis retourne et supprime le premier élément de ce tableau. Il est courant d'obtenir tous les paramètres passés dans un sous-programme avec des appels shift
. Par exemple, supposons que vous ayez un sous-programme foo
qui accepte trois arguments. Une façon d'obtenir ces paramètres assignés aux variables locales est avec shift
comme ceci:
sub foo() {
my $x = shift;
my $y = shift;
my $z = shift;
# do something
}
La confusion ici est qu'il semble que shift ne passe pas un tableau comme argument. En fait, le tableau "par défaut" est implicitement transmis, qui est @_
à l'intérieur d'un sous-programme ou @ARGV
en 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'en est pas donné comme paramètre) est @_
si vous êtes dans une fonction, ou @ARGV
si vous êtes dans la portée du fichier.
Donc dans ce cas $x
est soit défini sur le premier paramètre de fonction, soit 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é précédemment par PullMonkey, dans un sous-programme, @_
contient les arguments passés à ce sous-programme (comme décrit dans perlsub
). shift
supprimera la première valeur d'argument de @_
et le stocker dans $x
, donc $_[0]
vous donnera maintenant le second argument passé à votre sous-programme.
C'est généralement un idiome pour: $ x est une variable locale affectée au premier paramètre passé au sous-programme, cependant.
my ($x) = @_;
est probablement plus clair (et il ne modifie pas la liste des arguments).
Si vous êtes dans un sous-programme, cette ligne sera shift
sur @_
(les paramètres transmis).
Donc $x
serait le premier élément popped
du @_
tableau.
Donc, généralement, vous voyez $x = shift if @_;
dans la langue d'un profane, d'une vue de très haut niveau, shift prend le premier élément d'un tableau (la partie la plus à gauche), tandis que l'inverse est pop qui prend le dernier élément du tableau (la partie la plus à droite).
my @ array1 = (5,6,7,8,9); my $ x = shift @ array1; print "$ x\n"; # 5 Print "@ array1\n"; # 6 7 8 9