У меня проблемы с компиляцией одного из моих модулей с тем, что выглядит как проблема с изменяемой областью видимости, но я не понимаю, почему.
Пример кода :
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
А именно, похоже, он жалуется на использование $file
в блоке continue
внизу. Как видите, $file
объявлено как лексическая переменная в строке 2 внутри внешнего цикла foreach (обозначено PATH).
Однако, исходя из perldoc для continue , я ожидал бы, что $file
все еще будет находиться в области видимости:
[...] он всегда выполняется непосредственно перед тем, как условная оценка собирается снова быть оценена, точно так же, как третья часть цикла for в C. Таким образом, его можно использовать для увеличения переменной цикла, даже когда цикл было продолжено [...]
Чтобы иметь возможность увеличивать переменную цикла, разве блок продолжения не должен обрабатываться как часть той же лексической области, что и цикл, к которому он присоединен?
Чего мне не хватает?
Примечание. Этот модуль является классом Moo, поэтому, хотя у меня нет явного оператора use strict
, , когда вы используете Moo, мы включаем строгие и предупреждения .