2010-08-28 6 views
37

Je suis nouveau à Perl, et je les ai utilisés comme celui-ci

$_

foreach (@list) { 
    print "$_\n"; 
} 

@_

sub search { 
    my ($no, @list) = @_; 
} 

Comment exactement ces fonctionnent les variables en soulignent Perl? Quelles sont les autres constructions où elles sont utiles?

+15

[perldoc perlvar] (http://perldoc.perl.org/perlvar.html), [perldoc perlsyn] (http://perldoc.perl.org/perlsyn.html) – Ether

+17

Il semble que vous pourriez faire un beaucoup plus d'utilisation d'une introduction à l'essentiel de perl que les réponses StackOverflow. Avez-vous été à http://learn.perl.org/? Il y a des ressources, y compris la documentation officielle Perl, les livres Perl (y compris Beginning Perl gratuit en ligne) et des tutoriels en ligne de haute qualité. – hobbs

Répondre

45

C'est le genre de question qui vous indique vraiment devrait lire un livre, et peut-être le reste de la balise perl faqs.

Néanmoins, $_ est une variable de contexte qui est créée implicitement par certaines constructions et utilisée implicitement par certaines fonctions intégrées. Voici quelques exemples:

while(<>) { 
    next if /^#/; 
    last if /^q(?:uit)?$/; 
    say "Howdy!" if /^hello$/; 
} 

Ce faisant beaucoup de milieu de travail et d'inspection de la variable $_ et est équivalent à:

while(defined($_ = <>)) { 
    next if $_ =~ /^#/; 
    last if $_ =~ /^q(?:uit)?$/; 
    say "Howdy!" if $_ =~ /^hello$/; 
} 

D'autres constructions qui définissent $_ sont: foreach boucles, given blocs, map et grep opérations, et catch blocs dans Try::Tiny.

D'autres constructions qui utilisent $_ sont: les instructions print; nues, l'opérateur de substitution s/// et l'opérateur de translittération tr///.

Je vous le dis: pendant que vous apprenez Perl, n'utilisez pas $_ implicitement. Ecrivez tout cela en entier (comme dans le deuxième exemple ci-dessus), pour renforcer dans votre esprit ce qui se passe réellement. Tout comme lorsque vous apprenez une langue étrangère, vous devez apprendre à parler correctement et soigneusement avant d'apprendre à abréver la langue. $_ est utile pour écrire du code terser plus court, et peut être plus clair en se concentrant sur le traitement en cours plutôt que sur les variables pour lesquelles il est fait, mais seulement une fois que vous avez appris que les opérations utilisent $_. Sinon, c'est juste un gâchis déroutant.

Comme mentionné ailleurs, @_ est la liste d'arguments à un sous-programme.

+4

Comme l'OP l'a remarqué, parfois l'appel implicite de 'print' n'aide pas si l'on a besoin d'ajouter une nouvelle ligne par la suite. Les Perl les plus récents ont la commande 'say' qui peut agir sur' $ _' mais ajoute une nouvelle ligne pour vous. 'use feature 'say'' ou' use 5.10.0' pour l'activer. Philip, je sais que tu le sais comme c'est dans ton exemple, je ne faisais que dire pour être complet. –

+0

File :: Find :: find contient aussi les '$ _'; Je ne suis pas sûr d'énumérer les modules qui définissent $ _ ici, cependant; ils ne sont pas des "constructions". – ysth

+1

Votre lien 'book' est maintenant mort. – Ruslan

4

Ce sont des variables spéciales en Perl. Voir Perl - Special Variables.

+0

ceci ne liste pas @_ – nmz787

+1

Une meilleure référence serait http://perldoc.perl.org/perlvar.html – Flimm

Questions connexes