Perl中语句修饰符形式的while为何不能用last?旧版本是否支持?
关于Perl语句修饰符中使用
last的问题 这是Perl的普遍语法规则,并非你写的这条语句的特定问题,而且任何Perl版本都不支持在语句修饰符形式的while/until/for中使用last——哪怕是很早的旧版本也不行。
你的示例代码对比
- 可正常运行的Perl代码:
perl -le '$d=1; while(1){ $d/=2 and ++$i or last } print "i=$i"' - 运行报错的Perl代码:
执行后触发的错误提示:perl -le '$d=1; $d/=2 and ++$i or last while 1; print "i=$i"'Can't "last" outside a loop block at -e line 1.
核心原因解释
Perl里的last、next、redo这类循环控制语句,必须依附于块形式的循环结构(也就是while (...) { ... }、for (...) { ... }这种带大括号包裹的循环块)。而语句修饰符形式的循环(比如statement while condition;写法),本质是把循环逻辑附加在单个语句上,并没有创建一个可供last绑定的循环块上下文。
简单说,当你写last while 1时,last找不到它所属的“循环块”——这里的while只是用来修饰前面的语句,不是独立的循环块结构,所以Perl会判定last处于循环块之外,进而报错。
而你那行可用的代码里,last写在while(1){ ... }的大括号内部,属于明确的循环块上下文,所以能正常触发循环终止逻辑。
版本兼容性说明
哪怕是Perl 5的早期版本(比如v5.6、v5.8),这个语法规则也同样适用。语句修饰符形式的循环里不能使用last/next/redo,是Perl语法设计上的固定规则,并非某个版本新增或修改的特性。
内容的提问来源于stack exchange,提问作者Kjetil S.
相关产品推荐
相关产品推荐

