Perl:在foreach循环内定义了LABEL,使用“后藤LABEL”跳转到LABEL时出现问题

des4xlb0  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(212)
use strict;
use warnings;
my @content1=("sunTerio", "builds123", "build123_sunTerio", "glorai", "2131flow" , "build434_glorai");
my $tryVar;
&tty;

sub tty {
  foreach my $we (7..9) {
    $tryVar=1;
    LABEL34:                                           #### Line 12
    foreach my $i (@content1) {
        if (grep ((/sunTerio/i || /glorai/i), $i)) {   #### Line 14
            print "-----$i-----\n";
        }
    }

    if ($tryVar) {
        foreach my $r (1..5) {
           if ($r == 2 ) {
                $tryVar=0;
                goto LABEL34;
          
           }
        }
    }
  }
}

以上是代码片段。在这里,当我在“LABEL 34”所在的位置(第12行)使用“LABEL 34”时,它不会导致任何问题。但当我在“第14行”使用“LABEL 34”时,它会导致出现(警告+错误)消息的问题:

不赞成在www.example.com行使用“后藤”跳转到构造pl.pl。不能在pl.pl第14行“goto”跳转到foreach循环的中间。

为什么当我在第14行使用LABEL 34时,只有问题出现;而不是当LABEL 34位于当前位置(第12行)时,尽管这两种情况都在foreach循环下?
谢谢你!

hc2pp10m

hc2pp10m1#

我们讨论的foreach循环如下:

foreach my $i (@content1) {
   ...
}

从foreach循环的外部跳到它的主体没有任何意义。
这在逻辑上是没有意义的。foreach循环体是为列表中的每一项执行的。这个循环体将在没有项的情况下执行。
实际上,这是没有意义的。它将跳过@content1的求值和$i的初始化。使用$i将是未定义的行为。当你到达循环的末尾时,会发生什么?你如何检查你是否已经到达了一个你从未创建过的列表的末尾?
这是应该被允许的,而且肯定不是故意的。
我不能建议把标签放在第14行的替代方案,因为你还没有说你想做什么(我通常可以猜到,但这根本没有意义)。

相关问题