Почему можно было бы объявить и инициализировать лексическую переменную в отдельных операторах?
Это выдержка из 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
Поскольку ссылки замыкания $read_watcher
и область, в которой $read_watcher
разрешается лексика, начинается только с утверждения после этого, содержащего my
.
Это преднамеренно, поэтому такой код относится к двум отдельным переменным:
my $foo = 5;
{
my $foo = $foo;
$foo++;
print "$foo\n";
}
print "$foo\n";