2011-07-17 19 views
15

Đây là một đoạn trích từ AnyEvent::IntroTại sao một người chọn khai báo và khởi tạo biến từ vựng trong các câu lệnh riêng biệt?

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

Tại sao nó sử dụng

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

thay vì

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

?

+0

afaik có sự khác biệt; có thể chỉ là phong cách – ShinTakezou

+2

ShinTakezou: bạn đã thử nó chưa? với nghiêm ngặt? Việc ném 'Biểu tượng toàn cục' $ read_watcher "yêu cầu tên gói rõ ràng 'trong phần sau là sự khác biệt khá lớn. Ngay cả khi không nghiêm ngặt, $ read_watcher từ vựng sẽ là một biến khác với gói scoped $ read_watcher bên trong coderef. – MkV

+2

Từ AnyEvent :: Giới thiệu: Lý do cho điều này là một điều không minh bạch trong cách thức hoạt động của Perl: tên biến được khai báo với "của tôi" chỉ hiển thị trong câu lệnh tiếp theo. Nếu toàn bộ cuộc gọi "AnyEvent-> io", bao gồm cả gọi lại, sẽ được thực hiện trong một câu lệnh duy nhất, hàm gọi lại không thể tham chiếu biến $ read_watcher để "undef" ine nó, do đó, nó được thực hiện trong hai câu lệnh. – MkV

Trả lời

24

Bởi vì tài liệu tham khảo đóng cửa $read_watcher và phạm vi mà tại đó $read_watcher giải quyết đến từ vựng chỉ bắt đầu với tuyên bố sau mà chứa my.

Đây là cố ý để mã như thế này đề cập đến hai biến riêng biệt:

my $foo = 5; 

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

print "$foo\n"; 
Các vấn đề liên quan