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 в ноль при входе во внешнюю область?

Ответы на вопрос(1)

Ваш ответ на вопрос