标签不能持续使用,即前面的标签断裂?

Label cannot be used to last i.e. break for label in the front?

为什么 perl 无法持久,即 break for label in the front ahead? 正确的语法应该如何?

my $f;my $err=9;
my @l=(7,8,9,10);
for (@l) { 
  last T if $_==$err
}
$f=@l;
print "\ncomplete";
T:
print "\ncontain error";

Label not found for "last T" at ./non.pl line 17 

要使用 last T,您需要处于标签为 T 的循环内。

做你想做的事,正确的语法是

goto T if $_==$err
  • return 退出作用域直到找到子调用,
  • die 退出作用域,直到找到 eval,并且
  • lastnextredo 退出范围,直到找到循环。

要向前跳转,请使用 goto

goto T if $_ == $err;

但这不是更清楚吗:

my @l = ( 7, 8, 9, 10 );

my $err = 9;

my $f;
if ( grep { $_ == $err } @l ) {   # Or `first` from List::Util
   say "contain error";
   $f = undef;
} else {
   say "complete";
   $f = @l;
}

如果您打算多次检查同一个 @l,这样会更好:

my @l = ( 7, 8, 9, 10 );
my %l = map { $_ => 1 } @l;

my $err = 9;

my $f;
if ( $l{ $err } ) {
   say "contain error";
   $f = undef;
} else {
   say "complete";
   $f = @l;
}