2010-02-16 36 views

Trả lời

2

Bạn sẽ nhận được một cảnh báo nếu bạn redeclare một my, our hoặc state biến trong phạm vi hiện tại hoặc tuyên bố. Đầu tiên $i không thực sự là một biến từ vựng. Bạn có thể chứng minh điều này bằng Devel::Peek:

use Devel::Peek; 

for my $i (1) { 
    Dump $i; 
} 

SV = IV(0x81178c8) at 0x8100bf8 
REFCNT = 2 
FLAGS = (IOK,READONLY,pIOK) 
IV = 1 

Không có PADMY cờ trong CỜ, mà sẽ chỉ ra rằng $i là một biến từ vựng, tuyên bố với my.

9

Thực tế, bạn chỉ nhận được cảnh báo cho các định nghĩa lại trong cùng một phạm vi. Viết:

use warnings; 
my $i; 
{ 
    my $i; 
    # do something to the inner $i 
} 
# do something to the outer $i 

hoàn toàn hợp lệ.

Tôi không chắc chắn nếu internals Perl xử lý nó theo cách này, nhưng bạn có thể nghĩ for vòng lặp của bạn như đang được phân tích như

{ 
    my $i; 
    for $i (...) { ... } 
    # the outer scope-block parens are important! 
};
+0

ví dụ thứ hai của bạn không phải là ở tất cả giống như là người đầu tiên, vì sự phạm vi khác nhau, cũng như vòng lặp lặp được đặt bí danh cho các phần tử mảng (có nghĩa là nếu bạn thay đổi $ i trong vòng lặp, bạn sẽ thay đổi mảng của mình hoặc tạo cảnh báo nếu các phần tử là hằng số). – Ether

+0

chúng đều nằm trong cùng một phạm vi của khối, trong khi các ví dụ của bạn đều nằm trong các phạm vi khác nhau. –

+0

Tính năng bí danh trong ví dụ thứ hai hoạt động như mong đợi, hãy thử làm theo cách riêng của mình: @a = (1 .. 3) của tôi; {my $ i; với $ i (1 .. 3) {$ i = 'x'; }} in "a: @a"; Đối với cùng phạm vi: như câu hỏi cho thấy, khai báo trong biểu thức rõ ràng không nằm trong phạm vi tương tự như khai báo trong khối bên trong. – willert

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