Vấn đề là nguyên mẫu chức năng của Perl không làm những gì mọi người nghĩ rằng họ làm. Mục đích của họ là cho phép bạn viết các hàm sẽ được phân tích cú pháp như các hàm dựng sẵn của Perl.
Trước hết, các cuộc gọi phương thức hoàn toàn bỏ qua các nguyên mẫu. Nếu bạn đang làm lập trình OO, nó không quan trọng nguyên mẫu của bạn phương pháp có. (Vì vậy, họ không nên có bất kỳ nguyên mẫu.)
Thứ hai, nguyên mẫu không được thi hành nghiêm ngặt. Nếu bạn gọi một chương trình con với &function(...)
, nguyên mẫu sẽ bị bỏ qua. Vì vậy, họ không thực sự cung cấp bất kỳ loại an toàn nào.
Thứ ba, chúng là hành động ma quái ở khoảng cách xa. (Đặc biệt là nguyên mẫu $
, làm cho tham số tương ứng được đánh giá trong ngữ cảnh vô hướng, thay vì ngữ cảnh danh sách mặc định.)
Đặc biệt, chúng khó chuyển các tham số từ mảng. Ví dụ:
my @array = qw(a b c);
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
sub foo ($;$$) { print "@_\n" }
foo(@array);
foo(@array[0..1]);
foo($array[0], $array[1], $array[2]);
in:
a b c
a b
a b c
3
b
a b c
cùng với 3 cảnh báo về main::foo() called too early to check prototype
(nếu cảnh báo được kích hoạt). Vấn đề là một mảng (hoặc mảng mảng) được đánh giá trong ngữ cảnh vô hướng trả về độ dài của mảng.
Nếu bạn cần viết chức năng hoạt động như được tích hợp sẵn, hãy sử dụng mẫu thử nghiệm. Nếu không, không sử dụng nguyên mẫu.
Lưu ý: Perl 6 sẽ có các nguyên mẫu hoàn toàn được sửa lại và rất hữu ích. Câu trả lời này chỉ áp dụng cho Perl 5.
Tôi cũng tò mò. Thời gian duy nhất tôi không sử dụng chúng là khi tôi gọi với một số lượng các đối số. –
Tôi có thể khuyên bạn nên đọc bài viết, [“Nguyên mẫu Perl được coi là có hại”] (http://www.perlmonks.org/?node_id=861966)? – tchrist