web-dev-qa-db-fra.com

Que fait shift () en Perl?

Que pourrait signifier la ligne suivante?

my $x = shift;
66
cam

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.

54
cowgod

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.

14
Alnitak

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.

6
Gaurav

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).

2
David Nehme

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 @_;

0
PullMonkey

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 
0
mhd