2015-03-04 18 views
5

Tôi thừa kế một số mã perl mà tất nhiên không sử dụng hoặc nghiêm ngặt hoặc cảnh báo, và tôi tiếp tục sử dụng các biến uninitialized và muốn.Phần mã khung sử dụng nghiêm ngặt/không nghiêm ngặt?

Tôi muốn đặt dấu ngoặc các phần của mã mà tôi đang thay đổi như thế này:

use warnings; 
use strict; 

... my code changes and additions ... 

no strict; 
no warnings; 

Và đó dường như làm việc, nhưng tôi có vấn đề giải mã những gì the perldoc on use có nghĩa là khi nó nói đây là những chỉ thị trình biên dịch nhập vào "phạm vi khối" hiện tại. Điều đó có nghĩa là bất kỳ phạm vi nào có thể có một use strict không được ghép nối với một số no strict? Có phải no strict ở đuôi phạm vi toàn cầu về cơ bản không hoàn thành ý nghĩa của use strict trước đó trong cùng phạm vi?

+1

Tôi sẽ xác nhận đây là một ý tưởng hay * tạm thời * làm việc với mã hiện có. Thậm chí tốt hơn là đặt các bổ sung của bạn vào các hàm trong một tệp thư viện riêng biệt. Cuối cùng bạn sẽ muốn mang lại cho nó tất cả theo nghiêm ngặt. – Schwern

+0

Một người nào đó không 'sử dụng nghiêm ngặt' tất nhiên cũng không cho phép đóng gói mã dễ dàng ... Tôi phải thêm vào số thứ tự toàn cầu của họ, bạn thấy ... – stevesliva

+3

Vâng, nó bực bội, nhưng nó không ngăn chặn bạn sử dụng các chương trình con thư viện. Bạn có thể tham khảo hình cầu của chúng với '% main :: blah' (giả sử nó nằm trong gói chính). Thậm chí tốt hơn, vượt qua globals của bạn, bạn cần phải sửa đổi vào chương trình con của bạn bằng cách tham khảo: 'some_new_sub (\% blah)'. Nó sẽ ngăn chặn mess toàn cầu của họ từ lây nhiễm mã mới. Điều này sẽ lộn xộn lúc đầu, nhưng nó sẽ cung cấp cho bạn một ý tưởng tốt hơn về mã nào cần dữ liệu gì. Thông qua tất cả điều này, mô hình Extract Method sẽ là công cụ mạnh nhất của bạn. – Schwern

Trả lời

10

"phạm vi khối" có nghĩa là cả hai use strict;no strict; có hiệu lực thi hành từ nơi họ đang đến hết khối kèm theo trong cùng, vì vậy không, một sau no strict không lùi lại một sớm use strict. Nó chỉ thay đổi nó cho phạm vi bên trong nhất từ ​​điểm đó trong mã trên. Vì vậy:

{ 
    use strict; 
    # strict in effect 
    { 
     # strict still in effect 
     no strict; 
     # strict not in effect 
    } 
    # strict in effect 
    no strict; 
    # strict not in effect 
    use strict; 
    # strict in effect 
} 
+0

Minh họa tốt, cảm ơn. Tôi có hai mối quan tâm: 1.) Có vài ví dụ về những người sử dụng 'không nghiêm ngặt 'cho điều này, để thay đổi khung thành mã không giới hạn. 2.) Tôi đã lo lắng có một loại giải thích 2-pass của phạm vi mà có thể làm cho mọi thứ không hoạt động như minh họa, do đó, xác nhận là tốt. – stevesliva

+2

"Phạm vi khối" cũng được gọi là "phạm vi từ vựng". Điều quan trọng cần lưu ý là phạm vi từ vựng không * không * nhập các cuộc gọi chương trình con. "Lexical" như trong "những gì bạn đọc trên trang". 'không nghiêm ngặt 'trong các khối nhỏ thường được sử dụng trong những dịp hiếm hoi khi bạn muốn sử dụng các tham chiếu tượng trưng. Sử dụng phổ biến là tạo các chương trình con khi đang di chuyển. '{không nghiêm ngặt 'refs'; * {$ sub_name} = sub {...}} '. – Schwern

+1

thay vì "phạm vi động" mà không thực hiện cuộc gọi chương trình con – ysth

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