11
votes

Pourquoi Wanturray revient-il dans le contexte scalaire lors de l'appelant FOO () || mourir?

Je viens de passer un tas de temps à déboguer un problème que j'ai retrouvé sur Wantarray () . Je l'ai distillé à ce cas de test. (Ignorer le fait que $! n'aura aucune information utile dans ce scénario). Ce que j'aimerais savoir, c'est pourquoi wanturraray ne pense pas qu'il est appelé dans le contexte de la liste dans le deuxième exemple: xxx

La sortie de ce test est la suivante: < / p> xxx


1 commentaires

+1 Question bien écrite


3 Réponses :


4
votes

logique ou ( || ) est un opérateur scalaire, il faut donc utiliser l'évaluation de foo () pour devenir contexte scalaire.

Essayez ceci: xxx

On vous attendrait à imprimer les éléments dans @a si ce n'est pas parce que le tableau a été évalué dans le contexte scalaire. < / p>


0 commentaires

9
votes

Parce que ce n'est pas appelé dans le contexte de la liste. || code> impose le contexte scalaire sur son côté gauche et son côté gauche dans ce cas est l'expression foo () code>.

Vous devez écrire à la place p >

my ( $one, $two ) = foo() or die $!;


0 commentaires

6
votes

La raison est dû à la préséance du || . Votre déclaration est essentiellement analysée comme ceci: xxx

le || met ses opérandes dans le contexte scalaire dans ce cas.

d'autre part, si vous changez || sur ou , qui a une priorité très inférieure, vos tests passeront. < / p>


1 commentaires

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.