2013-05-02 31 views
7

Là một chút của một người mới perl, tôi chỉ chạy vào một lỗi nơi tôi vô tình đã làm một cái gì đó tương tự (ví dụ đơn giản):Tại sao perl không cảnh báo khi redeclaring một biến trong một phạm vi bên trong?

my $i=0; 
for(my $i=0;$i<10; $i++) 
    { 
    print $i; 
    } 
print $i; # $i is zero, my code expected 9 

Từ Why don't I get a warning when I redeclare the Perl foreach control variable? Tôi hiểu rằng hành vi này được dự kiến; Tôi không nên nhận được cảnh báo trừ khi việc khai báo lại nằm trong cùng phạm vi.

Tuy nhiên, tôi không thể hiểu tại sao lại xảy ra trường hợp này. Tại sao perl không đưa ra cảnh báo ở đây? Dường như với tôi rằng đó có thể là nguyên nhân gây ra lỗi và thường không có ý định. Có một số trường hợp phổ biến mà đây là phong cách lập trình bình thường, để cảnh báo sẽ gây phiền nhiễu?

+3

@Mat - nhiều khả năng không, mã như vậy là kết quả của lỗi trong quá trình tái cấu trúc thủ công thay vì theo thiết kế. Ví dụ. nhiều khả năng là một lỗi hơn điều mong đợi. – DVK

+0

Duh. Và bởi vì đôi khi mọi người làm những thứ mà họ không có ý định làm, trình biên dịch có cảnh báo. – innaM

+0

@Mat: 'my $ foo; my $ foo; 'cũng yêu cầu một biến rõ ràng với' my', nhưng Perl vẫn phát hành cảnh báo _ "my" variable $ foo mask khai báo trước đó trong cùng scope_. Nó không chỉ là vấn đề "bạn đang thực hiện một yêu cầu rõ ràng". –

Trả lời

7

Perl không có xu hướng cảnh báo về các vấn đề về phong cách, nhưng tôi cảm thấy khó tin rằng ai đó sẽ cố ý muốn có cùng tên với độ sâu phạm vi khác nhau.

Trường hợp duy nhất mà nó có thể là hữu ích mà nói đến cái tâm là

{ 
    my $x = $x; 
    ... do some something that changes $x ... 
} 
# $x is restored here. 

Về phía cộng, có một perlcriticrule để xác định một vấn đề như vậy.

+0

+1 cho Perl :: Đề xuất phê bình. – dolmen

+0

@dolmen, Không chắc tôi sẽ gọi đó là đề xuất. Đó là một lựa chọn. – ikegami

+0

Tôi sẽ chấp nhận câu trả lời này, mặc dù nó không thực sự trả lời câu hỏi của tôi. Perlcritic có vẻ như một công cụ hữu ích để giúp đỡ với các vấn đề như thế này. – tengfred

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