Perl 不能将 last 与 while 语句修饰符一起使用

Kje*_* S. 11 perl

Perl 可以:

perl -le '$d=1; while(1){ $d/=2 and ++$i or last } print "i=$i"'
Run Code Online (Sandbox Code Playgroud)

但不是:

perl -le '$d=1; $d/=2 and ++$i or last while 1; print "i=$i"'
Run Code Online (Sandbox Code Playgroud)

这导致:

Can't "last" outside a loop block at -e line 1.
Run Code Online (Sandbox Code Playgroud)

这是一般情况还是此特定语句中的某些内容阻止了last此处?没有perl的使用能够做到last语句修饰(while/ until/for在早期版本在结束)?我现在在 v5.26 上进行了测试,并且没有现成的旧版本。

ike*_*ami 8

并非所有语句修饰符。

$ perl -M5.010 -e'last while 1; say "ok"'
Can't "last" outside a loop block at -e line 1.

$ perl -M5.010 -e'last until 0; say "ok"'
Can't "last" outside a loop block at -e line 1.

$ perl -M5.010 -e'last for 1; say "ok"'
ok
Run Code Online (Sandbox Code Playgroud)

众所周知,它在特殊情况下do BLOCK while EXPR;也不起作用。

$ perl -M5.010 -e'do { last } while 1; say "ok"'
Can't "last" outside a loop block at -e line 1.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它适用于for而不是其他人。


不是新的。

$ for v in 10 12 14 16 18 20 22 24 26 28 30 32; do
   printf '5.%s:\n' $v
   5.${v}t/bin/perl -M5.010 -e'last while 1; say "ok"'
done
5.10:
Can't "last" outside a loop block at -e line 1.
5.12:
Can't "last" outside a loop block at -e line 1.
5.14:
Can't "last" outside a loop block at -e line 1.
5.16:
Can't "last" outside a loop block at -e line 1.
5.18:
Can't "last" outside a loop block at -e line 1.
5.20:
Can't "last" outside a loop block at -e line 1.
5.22:
Can't "last" outside a loop block at -e line 1.
5.24:
Can't "last" outside a loop block at -e line 1.
5.26:
Can't "last" outside a loop block at -e line 1.
5.28:
Can't "last" outside a loop block at -e line 1.
5.30:
Can't "last" outside a loop block at -e line 1.
5.32:
Can't "last" outside a loop block at -e line 1.
Run Code Online (Sandbox Code Playgroud)