2011-07-17 6 views
15

これはなぜそれが代わりに別々の文で字句変数を宣言して初期化する理由は何ですか?

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

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

を使用していますか?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 
     } 
    }, 
); 

からの抜粋ですか。

+0

my $foo = 5; { my $foo = $foo; $foo++; print "$foo\n"; } print "$foo\n"; 
。おそらくちょうどスタイル – ShinTakezou

+2

新竹園:試してみましたか?厳しい? "グローバルシンボル" $ read_watcher "明示的なパッケージ名が必要"を投げることは、後者ではかなりの違いです。厳密でなくても、字句$ read_watcherはコード範囲内の$ read_watcherスコープのパッケージとは異なる変数になります。 – MkV

+2

From AnyEvent :: Intro:これは、Perlが動作する際の癖です。「my」で宣言された変数名は、次のステートメントでのみ表示されます。コールバックを含む "AnyEvent-> io"呼び出し全体が単一の文で実行される場合、コールバックは$ read_watcher変数を参照して "undef"にすることができないため、2つのステートメントで実行されます。 – MkV

答えて

24

閉鎖参照$read_watcher$read_watcherは字句に解決される範囲のみmyを含む後に声明から始まるので。

このような、そのコードは、2つの別個の変数を意味するので、これは意図的である:いいえ差私の知る限り

関連する問題