Где делает $ _, прибывают из в этом цикле foreach Perl?

Я нашел это в Почте:: 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;
}

8
задан brian d foy 29 April 2010 в 16:07
поделиться

2 ответа

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

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

8
ответ дан 5 December 2019 в 17:35
поделиться

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

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

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

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

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

2
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: