Que fait shift () dans Perl?

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