2010-03-29 2 views
2

Quand je lance ceci:Pourquoi ne continue-t-il pas à exécuter le bloc suivant dans Perl 5.10?

use feature ':5.10'; 
$x=1; 
given ($x) { 
    when(1) { 
     say '1'; 
     $x = 2; 
     continue; 
    } 
    when (2) { 
     say '2'; 
    } 
} 

Cela devrait imprimer à la fois 1 et 2, mais il ne imprime 1. Suis-je manque quelque chose?

EDIT:

J'ai ajouté $ x = 2 et il imprime encore que « 1 »

+3

Pourquoi attendez-vous la sortie 2? '$ x' est 1. – friedo

+0

voir mon édition ... ne fonctionne toujours pas – JoelFan

+3

cela ne fonctionnera pas parce que' donné' copie '$ x' à' $ _', qui est le paramètre de la correspondance intelligente. Si vous définissez '$ _ = 2' dans le premier' when', cela fonctionnera. – friedo

Répondre

9

Voir la page de manuel perlsyn:

donné (EXPR) attribuera la valeur de expr $ _ dans le cadre lexical du bloc

Ce sorties de code 1 et 2:

use feature ':5.10'; 
$x=1; 
given ($x) { 
    when(1) { 
     say '1'; 
     $_ = 2; 
     continue; 
    } 
    when (2) { 
     say '2'; 
    } 
} 
4

Je pense que vous pouvez avoir de nombreux malentendus dans le but de continue ou la nature de fallthrough dans une construction de commutateur .

Chaque bloc when se termine par une interruption implicite, de sorte que le given est quitté lors d'une correspondance réussie. Tout continue fait dire au bloc given de continuer à traiter les conditions when et de ne pas sortir. Cela ne force pas la condition when suivante à être magiquement vraie quand elle ne l'est pas.

Considérons cela, ce fait sortie deux fois.

use feature ':5.10'; 
$x=1; 
given ($x) { 
    when(1) { 
     say '1'; 
     continue; 
    } 
    when (/1/) { 
     say '1 again'; 
    } 
} 
+0

voir mon édition ... ne fonctionne toujours pas – JoelFan

+0

Je pense que la source de mon malentendu était C, où "fall" dans "switch" ne fait aucun test supplémentaire ... il tombe juste à travers et exécute le bloc suivant. – JoelFan

0

Puisque donné n'est pas une construction de boucle (malgré et bandages poursuivre, ce qui est spécial tubé dans ce cas), utiliser foreach ou comme ceci:

use feature ':5.10'; 
$x=1; 
for ($x) { 
    when(1) { 
     say '1'; 
     $x = 2; 
     continue; 
    } 
    when (2) { 
     say '2'; 
    } 
} 

pour (expression) définit $ _ à l'expression, et que le comportement a été utilisé pour imiter l'interrupteur dans certains cas, avant donné/quand.

+0

C'est totalement faux, je ne sais pas par où commencer. –

Questions connexes