2013-01-22 29 views
8

Thực hiện phạm vi động, tôi đang sử dụng local. Sau đó, tôi tình cờ gặp this bưu điện, mà nói như sau:Luôn sử dụng; không bao giờ sử dụng địa phương?

Tại sao có địa phương ở tất cả? Câu trả lời là 90% lịch sử. Phiên bản đầu tiên của Perl chỉ có các biến toàn cầu. địa phương là rất dễ thực hiện, và đã được thêm vào Perl 4 như một giải pháp từng phần cho biến cục bộ vấn đề.

... không bao giờ sử dụng cục bộ.

Việc sử dụng nó có bị phản đối hay không được khuyến khích? Nếu có, lựa chọn thay thế là gì?

+0

Bài đăng bạn đã liên kết không sai về. Nhưng câu lệnh ** ... không bao giờ sử dụng ** địa phương. Giữ lại giá trị giữa các cuộc gọi hàm là một trong những lợi thế của 'local'. Khi bạn sử dụng 'my', bạn thực hiện phạm vi từ vựng, có nghĩa là nó chỉ hợp lệ giữa các dấu ngoặc nhọn của khối đó chứ không phải giữa các cuộc gọi hàm. Sử dụng của tôi khi bạn muốn các giá trị riêng biệt với mọi cuộc gọi. 'local' chỉ sử dụng lại các biến toàn cầu làm biến mới cho khối đó. –

+0

@Drt: 'biến' cục bộ * không * giữ lại giá trị của chúng trong các cuộc gọi hàm. – Borodin

+0

@borodin: từ [perldoc] (http://perldoc.perl.org/perlsub.html#Temporary-Values-via-local%28%29): 'địa phương chủ yếu được sử dụng khi giá trị hiện tại của biến phải là hiển thị để gọi các chương trình con.' –

Trả lời

26

Bài đăng bạn đã liên kết là gây hiểu lầm hoặc ít nhất là không đầy đủ. Đúng là bạn không bao giờ nên sử dụng local để tạo một biến từ vựng. Nó không làm như vậy, và đó là những gì my là dành cho.

Tuy nhiên, bạn nên sử dụng local khi bạn cần chức năng thực tế của nó: đưa ra giá trị tạm thời cho biến toàn cầu. Điều này thường được sử dụng để tạm thời thiết lập các biến đặc biệt của Perl. Trường hợp cổ điển giống như sau:

{ 
    local $/; 
    $entire_file = <$filehandle>; 
} 

Để đọc toàn bộ tệp cùng lúc, bạn cần đặt dấu phân cách bản ghi thành không xác định. Nhưng bạn chỉ muốn tạm thời làm điều đó; do đó local nên được sử dụng.

Điều này hoàn toàn không được khuyến khích. Nó được coi là mã Perl tốt.

Cập nhật: Tôi thấy rằng bài viết thực sự có ghi chú đủ điều kiện tuyên bố "không bao giờ sử dụng cục bộ" của nó. Tuy nhiên, tôi nghĩ rằng nó là sai lầm để làm cho một tuyên bố chăn. Tôi đồng ý với các nhà phê bình mà ghi chú đang phản hồi. Ví dụ trên là trường hợp cơ bản, phổ biến và có một số cách sử dụng phổ biến khác của local trong tĩnh mạch đó.

Tôi hiểu rằng hướng dẫn của người mới bắt đầu cần phải giữ mọi thứ đơn giản, nhưng đơn giản không có nghĩa là không chính xác. "Hiện tại, đừng lo lắng về local; chỉ cần sử dụng my" sẽ rõ ràng và đơn giản, nhưng sẽ không đánh lừa ai đó nghĩ rằng địa phương nên không bao giờ sử dụng.

+2

+1 Tôi đồng ý. Cơ chế bản địa hóa, * giá trị đẩy xuống, * giảm xuống *. Là một phần quan trọng của những gì làm cho Perl Perl (biểu cảm). Nếu nó không phải là khả năng tương thích ngược, chúng tôi có thể * vẫn * sử dụng ít biến như thế này - và điều đó sẽ làm tăng độ hiếm hơn nữa. Tôi nghĩ rằng điểm tốt nhất có thể được thực hiện trong tĩnh mạch này là nếu bạn đang bối rối về việc nên sử dụng 'local' hoặc' my', bạn có thể muốn - hoặc nên muốn - a * lexical *, và bạn có thể nên sử dụng 'my'.Ngay cả khi chỉ 1% các trường hợp bảo đảm một cách tiếp cận khác, rằng 1% nhiều hơn "không bao giờ". – Axeman

5

Sử dụng my để tạo biến cục bộ, phần lớn thời gian mọi người muốn.

Bạn có thể sử dụng local cho điều chỉ local thực hiện: đặt giá trị khác thành biến toàn cục, sẽ được khôi phục sau khối hiện tại. Đó là không có cách nào không được chấp nhận. Nó ổn định, được hỗ trợ tốt và là một tính năng chính của Perl. (Tuy nhiên, điều đó xảy ra không phải là thứ mà mọi người có xu hướng muốn bất kỳ nơi nào gần như thường xuyên như tạo ra một biến địa phương. Cụ thể là nhiều người mới bắt đầu không bao giờ cần phải làm điều này.)

Không khuyến khích sử dụng local để tạo biến địa phương, bởi vì đó là những gì my nên được sử dụng cho. Không bao giờ có lý do gì để sử dụng local cho việc này.

1

Thực tế không phải là lời khuyên xấu. Như với tất cả các chương trình dicta, phụ lục bất thành văn là "unless you really know what you're doing". Có các trường hợp sử dụng hợp pháp cho local. Nhưng nói chung, nếu bạn nghĩ rằng local là công cụ phù hợp, bạn nên xem xét lại trước khi tiếp tục.

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