2009-09-16 20 views
10

Tôi đang tìm một mô-đun có mục đích chung để giải quyết vấn đề về việc xác thực các đối số chương trình con và phương thức. Tôi đã quét qua các khả năng khác nhau trên CPAN: Params::Validate, Params::Smart, Getargs::Mixed, Getargs::Long và một số khác.Mô-đun Perl nào hữu ích để xác thực các đối số chương trình con?

Mọi thông tin liên quan đến ưu và nhược điểm của các mô-đun này hoặc các mô-đun khác sẽ được đánh giá cao. Cảm ơn.

Trả lời

6

Nếu bạn bắt đầu sử dụng , bạn sẽ tìm thấy MooseX::Types theo ý thích của mình. Các kiểu tự động có kiểu is_ $() và to_ $ type(). Đây là để đảm bảo rằng bạn nhập vào vượt qua các ràng buộc kiểu, hoặc làm cho đầu vào của bạn có một sự ép buộc hợp lệ đối với kiểu đó. Tôi thích họ tốt hơn ngay cả đối với những loại điều này bởi vì bạn có thể đảm bảo trạng thái của đối tượng của bạn có các loại đã nói mà không mất thêm chi phí.

use Moose; 
has 'foo' => (isa => MyType, is => ro); 

sub _check_my_type { 
    my ($self, $type) = @_; 
    is_MyType($type); 
}; 

Nó có thể thiếu một số hỗ trợ cho các loại sâu/đệ quy, nhưng nếu bạn sử dụng công cụ này trong perl hiện đại, có thể bạn đang "làm sai". Thay vào đó, hãy sử dụng một đối tượng có kiểm tra tính nhất quán của riêng nó (như của tôi ở trên với MyType) và chỉ truyền đối tượng.

+0

Moose không phải là một gợi ý tồi nếu bạn có thể sử dụng nó. Nếu bạn không thể, Chuột là Moose-light. Điều này sẽ giúp bạn kiểm tra kiểu và một vài thứ khác mà không cần tất cả các phụ thuộc của Moose và với cùng thời gian biên dịch. Để rõ ràng, tôi <3 Moose, nhưng đối với CGIs và nó không phải lúc nào cũng là lựa chọn tốt nhất. – mikegrb

+2

Chuột không được phát triển tích cực. Nó là một dự án đã chết (theo tài liệu của Mouse.pm Sử dụng Moose thay vì Mouse.). Thật không may, tài liệu chuột thậm chí không đề xuất nó cho CGI! Thay vào đó, họ nói "Mặc dù tiến bộ đáng kể đã được thực hiện qua nhiều năm, hình phạt thời gian biên dịch là không khởi động cho một số ứng dụng rất cụ thể. Nếu bạn đang viết một ứng dụng dòng lệnh hoặc tập lệnh CGI, thời gian khởi động là cần thiết, bạn có thể không thể sử dụng Moose. Chúng tôi khuyên bạn nên sử dụng HTTP :: Engine và FastCGI cho thứ hai, nếu có thể. " http://rt.cpan.org/Public/Bug/Display.html?id=42203 –

5

Hãy xem MooseX::Method::Signatures cung cấp nhiều hơn một chút so với việc chỉ xác thực đối số.

Ví dụ từ POD:

package Foo; 

use Moose; 
use MooseX::Method::Signatures; 

method morning (Str $name) { 
    $self->say("Good morning ${name}!"); 
} 

method hello (Str :$who, Int :$age where { $_ > 0 }) { 
    $self->say("Hello ${who}, I am ${age} years old!"); 
} 

method greet (Str $name, Bool :$excited = 0) { 
    if ($excited) { 
     $self->say("GREETINGS ${name}!"); 
    } 
    else { 
     $self->say("Hi ${name}!"); 
    } 
} 

MooseX::Method::Signatures cũng đi kèm như là tiêu chuẩn với MooseX::Declare mang lại thậm chí cú pháp sexy hơn với tấm Perl. Ở trên có thể được viết như sau (chỉ hiển thị phương pháp đầu tiên cho ngắn gọn):

use MooseX::Declare; 

class Foo { 

    method morning (Str $name) { 
     $self->say("Good morning ${name}!"); 
    } 
} 

Ngoài ra còn có một hệ quả tất yếu signatures CPAN module cho chương trình con đơn giản nhưng tiếc là nó không phải là tính năng phong phú như trên.

2

Tôi hiện đang nghiên cứu cùng một câu hỏi như OP

tôi nhận thấy rằng Dave Rolsky - lập trình viên siêu năng suất cao của sự nổi tiếng Moose - có thời gian gần đây (2009) thực hiện trên duy trì Params :: Validate, vì vậy tôi nghĩ rằng đây một dấu hiệu tốt. Mô-đun chưa được nâng cấp từ năm 2003. Vì vậy, tôi đoán, nó vẫn có thể được sử dụng lại để kiểm tra các tham số chương trình con.

+0

Tôi thích Params :: Validate, nhưng có vẻ như muốn chết thay vì báo cáo các thông số không hợp lệ bằng cách nào đó và để cho tập lệnh tiếp tục chạy ... – Marcus

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