Perl - Какие области видимости / замыкания / среды вызывают такое поведение?
Учитывая корневой каталог, я хочу определить самый мелкий родительский каталог из любого каталога .svn и pom.xml.
Для этого я определил следующую функцию
use File::Find;
sub firstDirWithFileUnder {
$needle=@_[0];
my $result = 0;
sub wanted {
print "\twanted->result is '$result'\n";
my $dir = "${File::Find::dir}";
if ($_ eq $needle and ((not $result) or length($dir) < length($result))) {
$result=$dir;
print "Setting result: '$result'\n";
}
}
find(\&wanted, @_[1]);
print "Result: '$result'\n";
return $result;
}
..и назови это так:
$svnDir = firstDirWithFileUnder(".svn",$projPath);
print "\tIdentified svn dir:\n\t'$svnDir'\n";
$pomDir = firstDirWithFileUnder("pom.xml",$projPath);
print "\tIdentified pom.xml dir:\n\t'$pomDir'\n";
Есть две ситуации, которые я не могу объяснить:
Когда поиск .svn успешен, значение$result
воспринимается внутри вложенной подпрограммыwanted
сохраняется в следующем вызовеfirstDirWithFileUnder
, Итак, когда начинается поиск пом, хотя строкаmy $result = 0;
все еще существует,wanted
Подпрограмма видит свое значение как возвращаемое значение из последнегоfirstDirWithFileUnder
вызов.Еслиmy $result = 0;
строка закомментирована, затем функция по-прежнему выполняется правильно. Это означает а) внешнюю сферу (firstDirWithFileUnder
) все еще можете увидеть$result
переменная, чтобы иметь возможность его вернуть, и б) печать показывает, чтоwanted
все еще видит$result
значение из прошлого времени, то есть, похоже, образовалось замыкание, которое сохранилось после первого вызоваfirstDirWithFileUnder
.Может кто-нибудь объяснить, что происходит, и предложить, как я могу правильно сбросить значение$result
в ноль при входе во внешнюю область?