2010-09-03 17 views
20

Tôi vừa chú ý đến điều này được tạo bởi Catalyst.pl. Nó rõ ràng là một loại hack không được bảo vệ. Lợi thế của việc thiết lập chuỗi phiên bản như thế này là gì? Tôi thậm chí không thể tìm ra những gì họ đang cố gắng làm.Chuỗi phiên bản Perl: tại sao lại sử dụng EVAL EXPR?

our $VERSION = '0.01'; 
$VERSION = eval $VERSION; 

Trả lời

25

Số phiên bản rất phức tạp trong Perl. Here's an excellent overview cho những người tìm kiếm chi tiết đẫm máu. Nó có thể làm bạn ngạc nhiên khi có bao nhiêu cách tinh vi để có được những điều sai trái ...

Câu trả lời trực tiếp cho câu hỏi của bạn là những thứ khác nhau mong đợi các định dạng khác nhau. Đối với CPAN, bạn quan tâm đến các phiên bản phát triển chẳng hạn như một chuỗi. Đối với thời gian chạy, bạn quan tâm đến chúng như một số.

Xem xét trường hợp của $VERSION = "0.01_001". eval chuyển đổi nó thành số 0.01001 chính xác.

+1

Thiên Chúa của tôi, tôi không có ý tưởng về phiên bản perl quá khủng khiếp. 1 cho bài viết tuyệt vời. –

+0

Cảm ơn bạn đã liên kết, đó là một trong những bài đăng trên blog Perl tốt hơn mà tôi đã đọc. Điều đó thực sự giải thích vấn đề này rất tốt (nhưng nó yêu cầu cập nhật trên các phiên bản 'version.pm'). –

5

Tôi chưa misremembering này, nhưng tôi nghĩ rằng một số phân tích cú pháp đang tự động thích để xem dòng mã:

our $VERSION = '0.01'; 

Nhưng bạn thực sự muốn $ VERSION tổ chức một phao thay vì một chuỗi.

Bạn có thể muốn đọc this article, tôi biết tôi sẽ tham dự.

Oh, thần thân mến, bây giờ tôi nhớ lý do tại sao tôi sử dụng

our $VERSION = 20100903; 

số phiên bản phong cách. Điều đó thật điên rồ. Tôi yêu Perl, nhưng đó là sự điên rồ, tinh khiết, tập trung. Tôi sẽ không cố gắng tóm tắt bài viết của David Golden. Bạn chỉ cần đọc nó và khóc.

+2

Số phiên bản chiếm 3 vị trí hàng đầu đối với tôi khi trả lời "5 điều bạn ghét về ngôn ngữ lập trình yêu thích của bạn là gì?". – szbalint

+0

@szbalint: Điều đó có vẻ giống như một suy nghĩ khá tốt trong top 5 rồi. –

6

eval chuyển đổi chuỗi "0.001_001" thành một số, theo các quy tắc cho chữ số Perl (cho phép dấu gạch dưới cho độ rõ ràng). Kết quả là số 0.001001.

Không có eval, chuỗi được chuyển đổi thành một số sau quy tắc chuyển đổi chuỗi, dừng lại ở ký tự không phải là số đầu tiên.

Ví dụ: perl -e 'print "0.001_001" + 0'

12

Từ perlmodstyle: Version numbering

Nếu bạn muốn phát hành một 'beta' hoặc phiên bản 'alpha' của một module nhưng không muốn CPAN.pm để liệt kê nó như gần đây nhất sử dụng '_' sau phiên bản thông thường số theo sau ít nhất 2 chữ số, ví dụ: 1,20_01. Nếu bạn làm điều này, các thành ngữ sau được đề nghị:

  1. $ VERSION = "1.12_01" ;
  2. $ XS_VERSION = VERSION $; # chỉ cần thiết nếu bạn có XS đang
  3. $ VERSION = eval $ VERSION;

Với lừa MakeMaker sẽ chỉ đọc dòng đầu tiên và do đó đọc các gạch dưới, trong khi người phiên dịch perl sẽ đánh giá $ VERSION và chuyển đổi chuỗi thành một số. sau đó hoạt động mà đối xử với $ VERSION như một số sau đó sẽ có thể làm như vậy mà không gây ra một cảnh báo về $ VERSION không phải là một con số.

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