【发布时间】:2019-03-27 22:31:55
【问题描述】:
我在编译我的一个模块时遇到了问题,这看起来是一个变量范围问题,但我不明白为什么。
示例代码:
PATH: foreach my $path (@paths) {
open(my $file, '<', $path) or next PATH;
my %properties;
LINE: while (<$file>) {
$_ =~ /$property_regex/ or next LINE;
$properties{$1} = $2;
}
foreach (@property_keys) {
unless ($properties{$_}) {
# do stuff
next PATH;
}
if ( $irrelevant_condition ) {
# do stuff
next PATH;
}
foreach my $new_var (@new_list) {
# do stuff (does not iterate PATH loop)
}
} continue {
if (defined $file) { close($file) or die; }
}
翻译成上面的精简代码,我得到的错误是:
全局符号“$file”在第 25 行需要明确的包名
也就是说,它似乎在抱怨在底部的continue 块中使用$file。如您所见,$file 在第 2 行被声明为一个词法变量,位于外部 foreach 循环(标记为 PATH)内。
但是,基于perldoc for continue,我希望$file 仍在范围内:
[...] 它总是在条件即将被再次评估之前执行,就像 C 中 for 循环的第三部分一样。因此它可以用来增加循环变量,即使循环已继续[...]
为了能够增加循环变量,是否将 continue 块视为与其附加到的循环相同的词法范围的一部分?
我错过了什么?
注意:这个模块是一个 Moo 类,所以虽然我在任何地方都没有明确的 use strict 声明,但 when you use Moo we enable strict and warnings。
【问题讨论】:
标签: perl