2011-07-17 9 views
15

Este es un extracto de AnyEvent::Intro¿Por qué uno elegiría declarar e inicializar una variable léxica en declaraciones separadas?

# 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 
     } 
    }, 
); 

¿Por qué usa

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

en lugar de

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

?

+0

AFAIK ninguna diferencia; probablemente solo estilo – ShinTakezou

+2

ShinTakezou: ¿lo intentaste? con estricto? Lanzar el 'Símbolo global' $ read_watcher 'requiere el nombre del paquete explícito' en este último es bastante la diferencia. Incluso sin estricto, el $ lexico $ read_watcher sería una variable diferente al paquete con alcance $ read_watcher dentro del valor del código. – MkV

+2

de AnyEvent :: Introducción: El motivo de esto es una peculiaridad en la forma en que funciona Perl: los nombres de variables declarados con "mi" solo son visibles en la siguiente declaración. Si toda la llamada "AnyEvent-> io", incluida la devolución de llamada, se haría en una sola declaración, la devolución de llamada no podría referirse a la variable $ read_watcher a "undef" ine it, por lo que se hace en dos instrucciones. – MkV

Respuesta

24

Debido a las referencias de cierre $read_watcher y el ámbito en el que $read_watcher la resolución a los léxica sólo comienza con la declaración después de que contiene el my.

Esto es intencional para que el código como esto se refiere a dos variables independientes:

my $foo = 5; 

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

print "$foo\n"; 
Cuestiones relacionadas