$_
est l'espace d'entrée et de correspondance de motif par défaut. En d'autres termes, si vous lisez à partir d'un descripteur de fichier en haut d'une boucle while, ou exécutez une boucle foreach sans nommer de variable de boucle, $_
est configuré pour vous.
Cependant, si vous écrivez une boucle foreach et nommez une variable de boucle, $ _ est pas défini up.This peut être justifiée par le code suivant:
1. #!/usr/bin/perl -w
2. @array = (1,2,3);
3. foreach my $elmnt (@array)
4. {
5. print "$_ ";
6. }
La sortie étant « Utilisation de la valeur non initialisée dans concaténation (.) »
Toutefois, si vous remplacez la ligne 3 par:
foreach (@array)
La sortie est "1 2 3" comme prévu. Maintenant, dans votre cas, il est toujours préférable de nommer une variable de boucle dans une boucle foreach pour rendre le code plus lisible (perl est déjà beaucoup maudit pour être moins lisible), de cette façon, il n'y aura pas non plus besoin de affectation à la variable $_
et aux problèmes de portée qui en résultent.
Bonne réponse, ++. Cependant, je ne suis pas d'accord que 'for (@array) {}' ne devrait être utilisé que si vous opérez principalement sur '$ _'. Le fait que la première version force une copie est bénéfique si vous envisagez de changer la valeur de '$ scalar'. Il n'y a aucune raison d'écrire 'pour mon $ alias (@array) {my $ scalar = $ alias; ...} '. Ceci dans une utilisation particulièrement valide de la forme de topicalizer de la boucle for. – daotoad
@daotoad => Je suis d'accord, répondre mis à jour, merci d'avoir rattrapé –