web-dev-qa-db-fra.com

Quel est le sens de @_ en Perl?

Quelle est la signification de @_ en Perl?

78
Andrei

perldoc perlvar est le premier endroit où rechercher des informations sur les variables Perl portant un nom spécial. 

Citant:

@_: dans un sous-programme, le tableau @_ contient les paramètres transmis à ce sous-programme.

Plus de détails peuvent être trouvés dans perldoc perlsub (sous-routines Perl) lié à partir de perlvar:

Tous les arguments passés apparaissent dans le fichier tableau @_

Par conséquent, si vous appelez une fonction avec deux arguments, ceux-ci serait stocké dans $_[0] et $_[1].

Le tableau @_ est un tableau local, mais son les éléments sont aliases pour les paramètres scalaires réels. En particulier, si un élément $ _ [0] est mis à jour, le l'argument correspondant est mis à jour (ou une erreur est générée s'il ne l'est pas pouvant être mis à jour). 

Si un argument est un tableau ou élément de hachage qui n'existait pas quand la fonction a été appelée, que L'élément est créé uniquement quand (et si) il est modifié ou sa référence est pris. (Certaines versions antérieures de Perl Créaient l'élément, que l'élément Soit affecté ou non.) Assigning to l'ensemble du tableau @_ supprime cela aliasing, et ne met à jour aucun arguments.

109
DVK

Généralement, vous développez les paramètres passés à un sub à l'aide de la variable @_:

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

C’est la façon dont on prétend être correct par perlcritic .

22
eckes

La question était de savoir ce que @_signifie en Perl. La réponse à cette question est que, dans la mesure où $_ signifie it en Perl, @_ signifie pareillement ils .

Personne ne semble avoir mentionné cet aspect critique de sa signification - ainsi que leur.

Par conséquent, ils sont tous deux utilisés comme pronoms ou parfois comme topicalizer. 

Ils ont généralement des antécédents nominaux, mais pas toujours.

9
tchrist

Premier coup d'un recherche de Perl @_ dit this :

@_ est la liste des paramètres entrants envoyés à un sous-traitant.

Il a également une explication plus longue et plus détaillée de la même chose.

8
Piskvor

Toutes les "variables spéciales" de Perl sont listées dans la page de documentation perlvar .

5
aschepler

Vous pouvez également utiliser shift pour des variables individuelles dans la plupart des cas:

$var1 = shift;

C’est un sujet dans lequel vous devriez approfondir vos recherches, car Perl dispose d’un certain nombre de moyens intéressants d’accéder à des informations extérieures dans votre sous-routine.

5
hockfan86

De même, si une fonction renvoie un tableau, mais que la fonction est appelée sans affecter ses données renvoyées à une variable comme ci-dessous. Ici, split () est appelé, mais il n'est affecté à aucune variable. Nous pourrons accéder à ses données renvoyées ultérieurement via @_:

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

Cela divisera la chaîne $str et définira le tableau @_.

2
Afser2000

@ est utilisé pour un tableau.

Dans un sous-programme ou lorsque vous appelez une fonction dans Perl, vous pouvez transmettre la liste de paramètres. Dans ce cas, @_ est utilisable pour transmettre la liste de paramètres à la fonction:

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

Appel de fonction

Average(10, 20, 30);

Si vous observez le code ci-dessus, voyez la ligne foreach $item(@_) ... Ici, le paramètre d'entrée est transmis.

1
Omar Faroque Anik

N'essayez jamais de modifier la variable @_ !!!! Ils ne doivent pas être touchés. Ou vous obtenez un effet insoupçonné. Par exemple...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

Avant d'appeler sub1 $ size contient 1234. Mais après 500 (!!) Donc vous ne modifiez pas cette valeur !!! Vous pouvez passer deux valeurs ou plus et les changer dans le sous-programme et elles seront toutes modifiées! Je n'ai jamais vu cet effet décrit. Les programmes que j'ai vus quittent également @_ array en lecture seule. Et seul le fait que vous puissiez passer en toute sécurité variable ne modifie pas le sous-programme interneVous devez toujours le faire:

sub sub2{
  my @m=@_;
  ....
}

attribuez @_ aux variables de procédure de sous-routine locales et ensuite travaillez avec elles . De plus, dans certains algorithmes récursifs profonds qui réutilisent tableau, vous pouvez utiliser cette approche pour réduire la mémoire utilisée par les vars locaux. Seulement si @_ array retourne la même chose. 

0
Anatoly