Даже если это, вероятно, ошибка, давайте рассмотрим, как этот код ведет себя.
Значение $_
будет определяться текущей динамической областью. Это означает, что $_
будет иметь любое значение (динамически копируемая копия) $_
в вызывающей подпрограмме.
Так, например, если у меня есть:
for (1 .. 5 ) {
foo();
bar();
}
sub foo {
print "\$_ = $_\n";
}
sub bar {
for ( 'a' .. 'c' ) {
foo();
}
}
Вы получите вывод как:
$_ = 1
$_ = a
$_ = b
$_ = c
$_ = 2
$_ = a
$_ = b
$_ = c
...
Это немного странно в Perl 5.10 и выше, где существует лексический $_
.
for (1 .. 5 ) {
foo();
bar();
}
sub foo {
print "\$_ = $_\n";
}
sub bar {
my $_;
for ( 'a' .. 'c' ) {
foo();
}
}
Запустите это и получите:
$_ = 1
$_ = 1
$_ = 1
$_ = 1
$_ = 2
$_ = 2
$_ = 2
$_ = 2
Как видите, если это не ошибка, вероятно, это плохая идея.