2010-09-02 37 views
10

Từ "chúng ta" perldoc:Tại sao các biến được khai báo bằng "của chúng tôi" hiển thị trên các tệp?

chúng tôi có các quy tắc Phạm vi tương tự như của tôi, nhưng không nhất thiết phải tạo ra một biến.

Điều này có nghĩa là các biến được khai báo với our không được hiển thị trên các tệp vì tệp là phạm vi từ vựng lớn nhất. Nhưng điều này là không đúng sự thật. Tại sao?

Trả lời

14

Bạn có thể xem xét our để tạo một bí danh lexically phạm vi thành biến toàn cầu gói. Gói globals có thể truy cập từ mọi nơi; đó là những gì làm cho họ toàn cầu. Nhưng tên được tạo bởi our chỉ hiển thị trong phạm vi từ vựng của tuyên bố our.

package A; 
use strict; 
{ 
    our $var; # $var is now a legal name for $A::var 
    $var = 42; # LEGAL 
} 

say $var; # ILLEGAL: "global symbol $var requires explicit package name" 
say $A::var; # LEGAL (always) 

{ 
    our $var; # This is the same $var as before, back in scope 
    $var *= 2; # LEGAL 
    say $var; # 84 
} 
+1

Cảm ơn, tôi hiểu ngay bây giờ. –

+0

Nó thực sự là một bí danh, nếu nó chỉ là một sự miễn trừ cho 'strict' thì 'perl -le' của chúng ta $ foo = 42; gói A; in "$ foo $ main :: foo" ' 42 42' sẽ in cùng một thứ với 'perl -le' sử dụng vars qw/$ foo /; $ foo = 42; gói A; in "$ foo $ main :: foo" '', đó là một sự miễn trừ, và chúng ta sẽ không cần' our'. –

+0

@Điểm tốt. – hobbs

7

Bạn đã có câu trả lời hay, nhưng có lẽ điều này cũng sẽ hữu ích.

Tuyên bố our kết hợp các khía cạnh của myuse vars. Nó hoạt động tương tự như use vars ở chỗ nó khai báo các biến gói; tuy nhiên, các biến được khai báo theo cách này bị lexically scoped và không thể được truy cập bên ngoài phạm vi mà chúng đã được khai báo (trừ khi bạn sử dụng tên đầy đủ của biến). Ngoài ra, biến được khai báo với our hiển thị trên toàn bộ phạm vi từ vựng của nó, ngay cả trên các ranh giới gói.

Đây là bảng tôi đã thêm vào ghi chú Perl của mình trong khi quay lại. Ví dụ, xem this SO answer.

   Scope/  Package 
       Namespace Variable Private New 
--------------------------------------------------- 
my   Lexical No   Yes  Yes 
our   Lexical Yes   No   No 
use vars  Package Yes   No   No 
+3

Mọi người phải nhớ rằng các gói không tạo phạm vi: [Biết điều gì tạo ra phạm vi] (http://www.effectiveperlprogramming.com/blog/48). –

+0

@brian Tôi lấy ý kiến ​​của bạn, và bài viết bạn viết là tốt nhất, nhưng tôi tự hỏi liệu các gói có đặc điểm giống như phạm vi nhất định hay không. Ví dụ: gói 'perl -le' Foo; $ x + = 10; in $ x; gói B; $ x + = 10; in $ x''. Có lẽ có một từ tốt hơn "phạm vi" để mô tả những gì đang xảy ra với ví dụ đó? Cảm ơn các đầu vào. – FMc

+0

Từ tốt hơn là "gói mặc định". Tuy nhiên, gói này không giới hạn khả năng hiển thị của các biến. Nó không giống như một phạm vi. –

Các vấn đề liên quan