2009-01-17 8 views
8

Je parcourais un code que j'avais écrit dans ma classe Perl et je l'ai remarqué.Que fait '@_' dans Perl?

my ($string) = @_; 
my @stringarray = split(//, $string); 

Je me demande deux choses: La première ligne où la variable est entre parenthèses, c'est quelque chose que vous faites lorsque vous déclarez plus d'une variable et si je les ai enlevés il fonctionne encore droit?

La deuxième question serait ce que fait le @_?

Répondre

21

La variable @_ est un tableau qui contient tous les paramètres transmis à un sous-programme.

Les parenthèses autour de la variable $string sont absolument nécessaires. Ils désignent que vous assignez des variables d'un tableau. Sans eux, le tableau @_ est affecté à $string dans un contexte scalaire, ce qui signifie que $string serait égal au nombre de paramètres passés dans le sous-programme. Par exemple:

sub foo { 
    my $bar = @_; 
    print $bar; 
} 

foo('bar'); 

La sortie est ici 1 - certainement pas ce que vous attendez dans ce cas.

Sinon, vous pouvez assigner la variable $string sans utiliser le tableau @_ et en utilisant la fonction au lieu shift:

sub foo { 
    my $bar = shift; 
    print $bar; 
} 

une méthode plutôt que l'autre est tout à fait une question de goût. J'ai posé cette même question which you can check out si vous êtes intéressé.

5

La variable @_ est un tableau (d'où le préfixe @) qui contient tous les paramètres de la fonction en cours.

9

Perl a deux contextes différents, un contexte scalaire et un contexte de liste. Un tableau '@_ ', s'il est utilisé dans un contexte scalaire, renvoie la taille du tableau. Donc, étant donné ces deux exemples, le premier donne la taille du tableau @_  , et l'autre vous donne le premier élément.

my $string = @_ ; 
my ($string) = @_ ; 

Perl a trois 'par défaut' des variables $_, @_, et en fonction de qui vous demandez %_. De nombreuses opérations utiliseront ces variables, si vous ne leur donnez pas de variable sur laquelle travailler. La seule exception est qu'aucune opération n'utilise actuellement par défaut %_.

Par exemple, nous avons push, pop, shift et unshift, que tous acceptent un tableau comme premier paramètre. Si vous ne leur donnez pas de paramètre, ils utiliseront la variable 'default' à la place. De même que 'shift;' est le même que 'shift @_;'

De la façon dont les sous-programmes ont été conçus, vous ne pouviez pas dire formellement au compilateur quelles valeurs vous vouliez dans quelles variables. Eh bien, il était logique d'utiliser la variable de tableau 'default' '@_' pour contenir les arguments.

Donc ces trois sous-programmes sont (presque) identiques.

sub myjoin{ 
    my ($stringl, $stringr) = @_; 
    return "$stringl$stringr"; 
} 

sub myjoin{ 
    my $stringl = shift; 
    my $stringr = shift; 
    return "$stringl$stringr"; 
} 

sub myjoin{ 
    my $stringl = shift @_; 
    my $stringr = shift @_; 
    return "$stringl$stringr"; 
} 

Je pense que le premier est légèrement plus rapide que les deux autres, parce que vous n'êtes pas en train de modifier la variable @_.

+0

Bonne réponse. Je ne pense pas que% _ soit jamais utilisé dans Perl, cependant. (Je veux dire, ce n'est jamais supposé et ce n'est pas une variable spéciale d'un autre type.) L'utilisateur peut l'utiliser, bien sûr, mais il n'enregistre même pas les frappes en tapant, par exemple, "keys" au lieu de "keys% _ ".) –

+0

Je ne pense pas avoir jamais rencontré une fonctionnalité Perl intégrée qui utilisera% _, par défaut, mais elle est toujours considérée comme l'une des variables par défaut. Ou du moins, je pense que je me souviens d'avoir lu ça quelque part. –

+0

Il n'y a pas de mot pour% _ en perlvar. Je ne l'ai vu nulle part durant mes nombreuses années de pratique professionnelle en perl. –

11

Lorsque vous rencontrez une variable spéciale (ou de ponctuation) en Perl, consultez the perlvar documentation. Il les répertorie tous, vous donne un équivalent English, et vous dit ce qu'il fait.