2013-05-22 22 views
9

Tôi bối rối về sự cần thiết của cú pháp use VERSION và cú pháp package NAME VERSION được giới thiệu trong Perl 5.12. Tôi dự kiến ​​phải chỉ định cả hai:Tôi có thể sử dụng cú pháp phiên bản gói 5.12 mới mà không chỉ định phiên bản Perl được yêu cầu không?

use v5.12; 

package MyPackage 0.01; 

và bất kỳ ví dụ nào tôi đã thấy như sau. Tuy nhiên, do tai nạn (tức là sao chép & dán mà không chú ý) tôi thấy rằng cú pháp phiên bản gói mới này đã hoạt động khi tôi có use 5.010 hoặc thậm chí không có phiên bản nào được chỉ định.

Cài đặt Perl cơ bản là ActiveState 5.14, vì vậy trong trường hợp này phiên bản thông dịch là yêu cầu duy nhất? Tôi đã ấn tượng rằng các tính năng mới luôn yêu cầu cú pháp use VERSION, để hỗ trợ khả năng tương thích ngược. Có ngoại lệ không?

Trả lời

11

Không phải mọi tính năng mới là một feature.

Cú pháp use VERSION thực hiện điều này:

  • ném ra một lỗi khi phiên bản perl hiện nay là quá thấp.
  • nhập bộ tính năng thích hợp từ feature pragma.Trang perldoc của phiên bản của tôi về feature danh sách:

    bundle features included 
    --------- ----------------- 
    :default array_base 
    
    :5.10  say state switch array_base 
    
    :5.12  say state switch unicode_strings array_base 
    
    :5.14  say state switch unicode_strings array_base 
    
    :5.16  say state switch unicode_strings 
          unicode_eval evalbytes current_sub fc 
    

    (trên thực tế, array_base được giới thiệu vào 5.16, nhưng đã được thêm vào gói trước cho back-compat).

  • kể từ 5.11.0, pragma strict được kích hoạt trong phạm vi hiện tại.

Một số thay đổi rất tương thích ngược mà không có nhu cầu để cung cấp một cách để kích hoạt chúng (đây là những gì feature pragma là về). Cú pháp use MODULE VERSION phần lớn tương thích ngược. Do dấu phẩy bị thiếu giữa phiên bản và danh sách nhập trong

use MODULE VERSION LIST; 

đây không phải là vấn đề (tức là cú pháp này trước đây là bất hợp pháp). Khi thiếu LIST, phương thức import sẽ nhận được số phiên bản trên perls không nhận ra cú pháp này. Mô-đun Exporter xử lý trường hợp này và kiểm tra phiên bản mô-đun. Vì vậy, tất cả các mô-đun cung cấp import qua nhà xuất khẩu (phần lớn) đều an toàn.

+0

Đây là một cách tốt hơn câu trả lời của tôi. – simbabque

+0

"Không phải mọi tính năng mới đều là" tính năng "- tôi thích điều đó, ngay cả khi nó cho thấy rằng câu hỏi ban đầu của tôi có thể đã được diễn đạt tốt hơn! –

+0

+1 Bảng đẹp và bạn cũng có thông tin 'sử dụng nghiêm ngặt;' trong đó. –

4

use VERSION cung cấp cho bạn tất cả những thứ bạn có thể bật rõ ràng với use feature và khiếu nại nếu phiên bản hiện tại của bạn thấp hơn số bạn muốn. Xem tài liệu này: http://perldoc.perl.org/functions/use.html

Một ngoại lệ được nêu ra nếu VERSION lớn hơn phiên bản của thông dịch viên Perl hiện tại ; Perl sẽ không cố gắng phân tích cú pháp phần còn lại của tệp.

[..]

use VERSION cũng cho phép tất cả các tính năng có sẵn trong phiên bản yêu cầu theo quy định của feature pragma, vô hiệu hóa bất kỳ tính năng không trong gói tính năng phiên bản yêu cầu của. Xem tính năng. Tương tự, nếu phiên bản Perl được chỉ định lớn hơn hoặc bằng 5.11.0, độ nghiêm ngặt được bật từ từ như sử dụng nghiêm ngặt. Mọi sử dụng rõ ràng của use strict hoặc no strict ghi đè use VERSION, ngay cả khi nó đến trước đó. Trong cả hai trường hợp, các tệp feature.pm và strict.pm không phải là thực sự được tải.

Nội dung chỉ thay đổi, như hành vi của một số chức năng, công cụ sửa đổi regex và các nội dung khác được mô tả trong perldelta không liên quan gì đến điều này. Bạn không thể buộc nó quay trở lại với hành vi của một phiên bản trước đó bởi vì đó không phải là thông dịch viên perl của bạn.


Ví dụ xảy ra với tôi khi chúng tôi gặp vấn đề này trong sản xuất là công cụ sửa đổi /r cho cụm từ thông dụng. Điều đó đã được giới thiệu trong Perl 5.14.0. Nếu bạn sử dụng nó trên 5.12 nó sẽ đưa ra một lỗi cú pháp. Ngay sau khi nó được chạy trên 5.14 nó sẽ làm việc, thậm chí với một chương trình như thế này:

#!/usr/bin/perl 
use strict; use warnings; 
my $foo = 'foobar'; 
print $foo =~ s/foo/oof/r; 
+0

Đó là nguyên nhân gây nhầm lẫn của tôi - tôi đã điều tra cú pháp phiên bản gói và xem xét perl5120delta; Tôi nghĩ tôi đã hiểu 'sử dụng VERSION'. Nhưng tôi nên kiểm tra lại lần nữa vì tôi không nhận ra cách tính năng 'hoạt động '. –

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