Я нашел это в Почте:: IMAPClient. Где делает $_
в $SEARCH_KEYS{ uc($_) }
произойти из?
sub _quote_search {
my ( $self, @args ) = @_;
my @ret;
foreach my $v (@args) {
if ( ref($v) eq "SCALAR" ) {
push( @ret, $$v );
}
elsif ( exists $SEARCH_KEYS{ uc($_) } ) {
push( @ret, $v );
}
elsif ( @args == 1 ) {
push( @ret, $v ); # <3.17 compat: caller responsible for quoting
}
else {
push( @ret, $self->Quote($v) );
}
}
return @ret;
}
Мне это кажется опечаткой, когда автор преобразовал анонимный цикл for в foreach (@args )
в один с явной переменной итератора для каждого моего $ v (@args)
и забыл преобразовать все случаи $ _
в $ v
.
Вам, вероятно, следует сообщить об ошибке в распространении на CPAN.
Даже если это, вероятно, ошибка, давайте рассмотрим, как ведет себя этот код.
Значение $_
будет определяться текущей динамической областью видимости. Это означает, что $_
будет иметь то значение (динамически скопированная копия), которое $_
имеет в вызывающей подпрограмме.
Так, например, если у меня есть:
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
Как видите, если это не ошибка, то, вероятно, плохая идея.