Почему можно выбрать объявление и инициализацию лексической переменной в отдельных выражениях? - PullRequest
15 голосов
/ 18 июля 2011

Это выдержка из AnyEvent::Intro

# register a read watcher
my $read_watcher; $read_watcher = AnyEvent->io (
    fh   => $fh,
    poll => "r",
    cb   => sub {
        my $len = sysread $fh, $response, 1024, length $response;

        if ($len <= 0) {
           # we are done, or an error occurred, lets ignore the latter
           undef $read_watcher; # no longer interested
           $cv->send ($response); # send results
        }
    },
);

Почему используется

my $read_watcher; $read_watcher = AnyEvent->io (...

вместо

my $read_watcher = AnyEvent->io (...

1 Ответ

24 голосов
/ 18 июля 2011

Поскольку замыкание ссылается на $read_watcher, а область, в которой $read_watcher разрешается до лексического, начинается только с оператора после , содержащего my.

Это преднамереннотак что этот код относится к двум отдельным переменным:

my $foo = 5;

{
    my $foo = $foo;
    $foo++;
    print "$foo\n";
}

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