Les Perldocs indiquent uniquement que foreach
boucle "itère sur une valeur de liste normale" https://perldoc.perl.org/perlsyn.html#Foreach-Loops , mais je les vois parfois avec des arguments de chaîne, comme les exemples suivants:
foreach (`curl example.com 2>/dev/null`) { # iterates 50 times } foreach ("foo\nbar\nbaz") { # iterates just 1 time. Why? }
Le comportement de passage d'une chaîne comme celle-ci est-il défini? Séparément, pourquoi la disparate résulte-t-elle du passage de la chaîne retournée par une commande inversée et d'une chaîne littérale, comme dans l'exemple?
4 Réponses :
Une chaîne n'est pas une liste. Si vous voulez parcourir les caractères d'une chaîne, vous aurez besoin de
>>> for c in "foo\nbar\nbaz": ... print c ... f o .... remainder deleted .... a z >>>
Je pense que vous pourriez confondre Perl avec Python:
foreach my $character (split('', "foo\nbar\nbaz")) {
Comme indiqué par les autres réponses, les backticks / qx {}
renvoient une liste de lignes de sortie de la commande exécutée dans un contexte de liste.
foreach ("foo") {...}
est un Perl parfaitement valide, bouclant sur la liste à un seul élément ("foo")
.
Depuis perldoc -f qx
:
Dans un contexte de liste, renvoie une liste de lignes (cependant vous avez défini des lignes avec $ / ou $ INPUT_RECORD_SEPARATOR), ou une liste vide si la commande a échoué.
De perldoc perlsyn
:
Instructions composées
[...]
LABEL pour chaque BLOC VAR (LIST)
Dans un contexte scalaire, les backticks renvoient un seul scalaire contenant toute la sortie de la commande incluse. Mais foreach (...)
évalue les backticks dans le contexte de la liste, ce qui séparera la sortie en une liste avec une ligne par élément.
La question tourne autour du contexte , un concept critique pour beaucoup de choses en Perl .
La boucle foreach
a besoin d'une liste à parcourir, elle impose donc le contexte de liste pour construire le list values que vous avez vu mentionné dans la documentation. La liste peut être formée avec des littéraux, qw (a b c)
, et peut avoir un élément; c'est votre deuxième exemple, où une chaîne est donnée, formant la liste à un élément qui est itérée.
La liste peut également provenir d'une expression, qui est évaluée dans le contexte de la liste; ceci est votre premier exemple. De nombreuses opérations donnent des retours différents en fonction du contexte, et qx
est un opérateur comme expliqué dans la réponse de mob. C'est quelque chose à noter et à faire attention. Une expression peut également renvoyer une valeur unique quel que soit le contexte; puis il est simplement utilisé pour remplir la liste.
Merci, c'était ma confusion. J'avais des hypothèses trop simples sur la façon dont Perl applique le contexte.
cf. print join ":", localtime
et print join ":", scalaire localtime
ou même print join ":", sub {wantarray? (1,2,3): "scalaire"} -> ()
for (split / ^ / m, $ file_contents)
vous donnera ce que vous voulez