Откуда берется $ _ в этом цикле Perl Perach? - PullRequest
8 голосов
/ 29 апреля 2010

Я нашел это в Mail :: IMAPClient . Откуда взялась $_ in $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;
}

Ответы [ 2 ]

8 голосов
/ 29 апреля 2010

Это выглядит как опечатка, когда автор преобразовал анонимный цикл for foreach (@args) в один с явной переменной итератора foreach my $v (@args) и забыл преобразовать все случаи $_ в $v.

Возможно, вы должны сообщить об ошибке в дистрибутиве на CPAN.

2 голосов
/ 30 апреля 2010

Даже если это, вероятно, ошибка, давайте рассмотрим, как этот код ведет себя.

Значение $_ будет определяться текущей динамической областью. Это означает, что $_ будет иметь любое значение (динамически копируемая копия) $_ в вызывающей подпрограмме.

Так, например, если у меня есть:

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

Как видите, если это не ошибка, вероятно, это плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...