Je viens de passer un tas de temps à déboguer un problème que j'ai retrouvé sur La sortie de ce test est la suivante: < / p> Wantarray () code>. Je l'ai distillé à ce cas de test. (Ignorer le fait que
$! Code> n'aura aucune information utile dans ce scénario). Ce que j'aimerais savoir, c'est pourquoi
wanturraray code> ne pense pas qu'il est appelé dans le contexte de la liste dans le deuxième exemple:
3 Réponses :
logique ou ( Essayez ceci: p> On vous attendrait à imprimer les éléments dans || code>) est un opérateur scalaire, il faut donc utiliser l'évaluation de
foo () code> pour devenir contexte scalaire.
@a code> si ce n'est pas parce que le tableau a été évalué dans le contexte scalaire. < / p> p>
Parce que ce n'est pas appelé dans le contexte de la liste. Vous devez écrire à la place p > || code> impose le contexte scalaire sur son côté gauche et son côté gauche dans ce cas est l'expression
foo () code>.
my ( $one, $two ) = foo() or die $!;
La raison est dû à la préséance du le d'autre part, si vous changez || code>. Votre déclaration est essentiellement analysée comme ceci:
|| code> met ses opérandes dans le contexte scalaire dans ce cas. p>
|| code> sur
ou code>, qui a une priorité très inférieure, vos tests passeront. P> < / p>
Merci beaucoup pour cela. :) C'était une sorte de lancement de choisir une réponse acceptée, mais celle que @Hobbs fournit semble un peu plus claire pour moi.
+1 Question bien écrite