如何跳出 Perl 中的循环?

发布于 2024-07-08 19:48:30 字数 347 浏览 7 评论 0原文

我试图在 for 循环中使用 break 语句,但由于我也在 Perl 代码中使用严格的 subs,所以我收到一条错误消息:

不允许使用裸字“break” ./final.pl 使用“严格 subs” 第 154 行。

是否有解决方法(除了禁用严格 subs 之外)?

我的代码格式如下:

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

I'm trying to use a break statement in a for loop, but since I'm also using strict subs in my Perl code, I'm getting an error saying:

Bareword "break" not allowed while
"strict subs" in use at ./final.pl
line 154.

Is there a workaround for this (besides disabling strict subs)?

My code is formatted as follows:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

幻梦 2024-07-15 19:48:31

对于带有隐式循环的 Perl 单行代码(使用 -n-p 命令行选项),请使用 lastlast LINE 来跳出迭代输入记录的循环。 例如,这些简单的示例全部打印输入的前 2 行:

echo 1 2 3 4 | xargs -n1 | perl -ne 'last if $. == 3; print;'
echo 1 2 3 4 | xargs -n1 | perl -ne 'last LINE if $. == 3; print;'
echo 1 2 3 4 | xargs -n1 | perl -pe 'last if $. == 3;'
echo 1 2 3 4 | xargs -n1 | perl -pe 'last LINE if $. == 3;'

全部打印:

1
2

perl 单行代码使用这些命令行标志:
-e :告诉 Perl 查找内联代码,而不是在文件中。
-n :一次循环输入一行,默认将其分配给 $_
-p :与 -n 相同,还在输入的每次循环迭代后添加 print

另请参见:

last 文档
上一个下一个重做继续 - 示例
perlrun:命令行开关文档


last 的更多示例 在 Perl one-liners 中:

在第一次匹配后中断一个 liner 命令行脚本
打印大文件的前 N ​​行

For Perl one-liners with implicit loops (using -n or -p command line options), use last or last LINE to break out of the loop that iterates over input records. For example, these simple examples all print the first 2 lines of the input:

echo 1 2 3 4 | xargs -n1 | perl -ne 'last if $. == 3; print;'
echo 1 2 3 4 | xargs -n1 | perl -ne 'last LINE if $. == 3; print;'
echo 1 2 3 4 | xargs -n1 | perl -pe 'last if $. == 3;'
echo 1 2 3 4 | xargs -n1 | perl -pe 'last LINE if $. == 3;'

All print:

1
2

The perl one-liners use these command line flags:
-e : tells Perl to look for code in-line, instead of in a file.
-n : loop over the input one line at a time, assigning it to $_ by default.
-p : same as -n, also add print after each loop iteration over the input.

SEE ALSO:

last docs
last, next, redo, continue - an illustrated example
perlrun: command line switches docs


More examples of last in Perl one-liners:

Break one liner command line script after first match
Print the first N lines of a huge file

送你一个梦 2024-07-15 19:48:30

哦,我找到了。 您使用 last 而不是 break

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

它也在“perlsyn(1)”中的循环控制下进行了描述(UNIX 上的 man perlsyn -喜欢)。

Oh, I found it. You use last instead of break

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

It's also described under Loop Control in "perlsyn(1)" (man perlsyn on UNIX-like).

乖乖兔^ω^ 2024-07-15 19:48:30

附加数据(如果您有更多问题):

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

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

Additional data (in case you have more questions):

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

                    last FOO;  # --->
                                   # |
                 }                 # |
          }                        # |
       }                           # |
 } # <-------------------------------
稀香 2024-07-15 19:48:30

只需 last 就可以在这里工作:

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

如果您有嵌套循环,则 last 将从最内层循环退出。 在这种情况下使用标签:

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

给定 last 语句将使编译器从两个循环中退出。 可以在任意数量的循环中执行相同的操作,并且标签可以固定在任何地方。

Simply last would work here:

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

If you have nested loops, then last will exit from the innermost loop. Use labels in this case:

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

Given a last statement will make the compiler to come out from both the loops. The same can be done in any number of loops, and labels can be fixed anywhere.

乱了心跳 2024-07-15 19:48:30

在大型迭代中我喜欢使用中断。 只需按 Ctrl + C 即可退出:

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

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

On a large iteration I like using interrupts. Just press Ctrl + C to quit:

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

while(!$exitflag) {
    # Do your stuff
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文