322 votes

Comment sortir d'une boucle en Perl ?

J'essaie d'utiliser un break dans un for mais comme j'utilise également des subs stricts dans mon code Perl, j'obtiens une erreur disant :

Le mot "break" n'est pas autorisé lorsque alors que "strict subs" est utilisé à ./final.pl ligne 154.

Existe-t-il un moyen de contourner ce problème (à part la désactivation des subs stricts) ?

Mon code est formaté comme suit :

for my $entry (@array){
    if ($string eq "text"){
         break;
    }
}

24 votes

Et si vous n'aviez pas activé l'option "strict subs", vous auriez obtenu une erreur d'exécution lorsque le système n'a pas pu trouver un sous-domaine nommé "break".

473voto

Zain R Points 4181

Oh, je l'ai trouvé. Vous utilisez dernier au lieu de rupture

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}

0 votes

Bien qu'il s'agisse d'une simple différence sémantique et que cela ne représente pas grand-chose d'autre qu'une cohérence textuelle avec la commande "next".

1 votes

Sans oublier que "break" est un mot-clé expérimental dans >5.010, n'est-ce pas ? vous risquez donc d'obtenir une erreur "illegal outside given block", sans pour autant l'utiliser. La seule façon dont cela pourrait fonctionner est d'utiliser une boucle while à l'intérieur d'un bloc donné, et ensuite break, ce qui en théorie fonctionnerait de la façon dont vous le souhaitez SI (et seulement si) le bloc donné n'avait que la boucle while à l'intérieur, et en supposant que vous ne fassiez qu'alimenter une variable scalaire... mais pourquoi faire tout ce travail juste pour utiliser un break, c'est (très) mal vu, sans parler de (blah !)juste pour dire, c'est "possible", mais ce n'est pas une bonne idée et ce n'est pas ce que vous pouvez penser

34 votes

Pour une raison quelconque, je suis complètement incapable de me souvenir de ce mot clé 'last'. je finis toujours par googler 'perl break loop' :(

178voto

Kent Fredric Points 35592

Données supplémentaires (au cas où vous auriez d'autres questions) :

FOO: {
       for my $i ( @listone ){
          for my $j ( @listtwo ){
                 if ( cond( $i,$j ) ){

                    last FOO;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------

2 votes

Tu n'as pas vraiment besoin d'appareil dentaire après FOO :

15 votes

Vous le faites si vous avez d'autres codes juste après la boucle for my $i que vous voulez aussi sauter. Le {} extérieur est un bloc nu, qui est lui-même une sorte de boucle bizarre qui peut être terminée/refaite/suivie.

48voto

gawbul Points 729

Vous recherchez le dernier mot-clé, par ex.

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}

Peut-être un peu hors sujet, mais je préférerais faire une

if (grep $_ eq "text", @array) {

}

L'itération sur de grandes listes en utilisant un for serait très lente, surtout si elles sont imbriquées !

25voto

Kamal Nayan Points 1156

Tout simplement last fonctionnerait ici :

for my $entry (@array){
    if ($string eq "text"){
         last;
    }
}

Si vous avez des boucles imbriquées, alors last sortira de la boucle la plus interne. Utilisez des étiquettes dans ce cas :

LBL_SCORE: {
    for my $entry1 (@array1) {
        for my $entry2 (@array2) {
            if ($entry1 eq $entry2) { # Or any condition
                last LBL_SCORE;
            }
        }
    }
 }

Étant donné un last fera en sorte que le compilateur sorte des deux boucles. La même chose peut être faite dans n'importe quel nombre de boucles, et les étiquettes peuvent être fixées n'importe où.

5voto

MortenB Points 328

Sur une grande itération, j'aime utiliser les interruptions. Il suffit d'appuyer sur Ctrl + C de démissionner :

my $exitflag = 0;
$SIG{INT} = sub { $exitflag=1 };

while(!$exitflag) {
    # Do your stuff
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X