2013-07-17 19 views

Trả lời

5

Có, our tuyên bố có thể có các tính năng bổ sung khi so sánh với hình cầu chưa được khai báo. Nhưng đây là phần lớn không liên quan.

our tạo bí danh từ vựng cho biến toàn cầu (có cùng tên). Tức là, trong các số package Foo, our $bar$Foo::bar, hãy tham khảo cùng một biến. Tuy nhiên, trước đây chỉ có sẵn trong một phạm vi từ vựng chặt chẽ.

Như our có hiệu lực thi hành từ vựng, bí danh cũng có thể shadow biến từ vựng với my:

our $foo = 42; # give some value 
my $foo = -1; # same name, different value 
say "my gives $foo"; 
our $foo;  # reintroduce the alias; shadow lexical 
say "our gives $foo"; 

Nếu bạn tách các our tờ khai và chạy nó mà không chặt chẽ, điều này rõ ràng sẽ không cung cấp cho các đầu ra

my gives -1 
our gives 42 

Giống như my, our có thể mất thêm một cú pháp khai báo thêm, ví dụ:thuộc tính:

use threads::shared; 
our $foo :shared; 

Bạn cũng có thể chỉ định một loại để sử dụng với fields pragma:

our Foo $foo; 

này không thể được thực hiện cho các biến toàn cục mà không our.

+0

Thực sự là một câu trả lời hay! – none

2

Như bạn có thể nhìn thấy từ perldocs, our tạo một bí danh cho một biến gói với tên giống như our ed biến trong gói hiện.

Nếu bạn đang viết mã có nhiều định nghĩa gói trong đó, bạn có thể sử dụng biến số our ed để chuyển biến bí danh giữa các mô-đun.

package Foo: 
our $bar = 42; # $bar is an alias for $Foo::bar 

package Baz; 
print $bar;  # prints '42', since $bar is $Foo::bar 

Do đó, việc sử dụng không liên quan gì đến các biến toàn cầu.

+1

Tất cả các biến gói là biến toàn cầu. Những gì sử dụng này chứng minh là có một mục đích để 'our' ngoài việc đáp ứng' strict'. – darch

+0

Theo câu hỏi sau (http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in-perl) các biến của chúng ta được cho là các biến gói và toàn cầu. Tôi không biết ai tin. – none

+0

@ không có: Không có xung đột nào ở đây. 'our' khai báo (một bí danh cho) các biến gói (global). – Borodin

2

Toàn cầu, biến gói có thể truy cập ở mọi nơi, cho dù strict có được đặt đúng hay không, nếu bạn chỉ định tên đủ điều kiện, tức là bạn đặt tiền tố cho tên gói. Vì vậy, tôi có thể truy cập $main::variable ở mọi nơi bất cứ lúc nào.

Nếu không có strict, nếu bạn truy cập $variable mà bạn chưa khai báo với my, Perl giả định đây là biến gói trong gói hiện tại. our có thể được sử dụng để khai báo rõ ràng một biến gói, nhưng không có strict nó không làm nhiều như bất cứ điều gì không khai báo cư xử theo cùng một cách.

Với strict tại chỗ, các biến được khai báo với our có thể truy cập được bằng tên địa phương cũng như tên đủ điều kiện của chúng, trong phạm vi từ vựng nơi khai báo xuất hiện. Điều đó có nghĩa là để truy cập vào một biến toàn cầu từ hai chương trình con, bạn phải khai báo nó trong cả hai chương trình con hoặc khai báo nó trước cả hai phần tử ở một phạm vi bên ngoài.

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