2011-07-17 10 views
15

Bu NedenNeden bir sözlük değişkenini ayrı ifadelerde bildirmeyi ve başlatmayı seçer?

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

yerine

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

ait kullanıyor 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 
     } 
    }, 
); 

bir alıntıdır?

+0

; muhtemelen sadece stil – ShinTakezou

+2

ShinTakezou: Denedin mi? sıkı? 'Küresel sembol' $ read_watcher 'atmak' açık paket adını gerektirir 'ikincisi oldukça farklıdır. Kesin olmasa bile, lexical $ read_watcher coderef'in içindeki paketlenmiş $ read_watcher'a farklı bir değişken olacaktır. – MkV

+2

AnyEvent :: Intro'dan: Bunun sebebi, Perl'in çalışmasında bir tuhaflıktır: "my" ile bildirilen değişken adları yalnızca bir sonraki ifadede görülebilir. Geri arama dahil tüm "AnyEvent-> io" çağrısı, tek bir bildirimde yapılırsa, geri arama $ read_watcher değişkenine "undef" ini atlatamaz, bu nedenle iki ifadede yapılır. – MkV

cevap

24

kapatma referansları $read_watcher ve $read_watcher sözcük olarak çözümlenir hangi kapsam sadece my içeren sonra açıklamada ile başlar çünkü.

gibi bir kod iki ayrı değişkenler için kullanılır, böylece bu şekilde yapılmıştır: bir fark afaik

my $foo = 5; 

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

print "$foo\n"; 
İlgili konular