pragma giới hạn bạn thành một tập hợp con nhỏ của Perl. Một số tính năng cũ làm cho ý nghĩa lịch sử (hoặc có lợi ích với một lớp lót), nhưng không có chỗ trong một cơ sở mã hiện đại, dễ đọc.
Các strict
pragma có ba loại:
"vars"
Forces bạn khai báo tất cả các biến của bạn. Điều này bảo vệ chống lại lỗi chính tả, và chắc chắn rằng bạn chọn một phạm vi (global/lexical). Trong một lớp lót, điều này không cần thiết nhiều, vì thường có rất ít phạm vi và rất ít biến. Một số thành ngữ một lớp lót sẽ không hoạt động với các biến từ vựng.
"refs"
không cho phép symrefs. Chúng không có ý nghĩa với các biến từ vựng, và Perl5 có các tham chiếu thực sự. Vì vậy, họ thường vô dụng. Tuy nhiên, symrefs vẫn có giá trị cho lập trình meta:
# generate accessors
for my $field (qw/foo bar baz/) {
no strict 'refs';
*{ __PACKAGE__ . '::' . $field } = sub { shift()->{$field} };
}
"subs"
buộc việc giải thích của hầu hết barewords như các cuộc gọi chương trình con. Điều này giải quyết sự mơ hồ của foo . "bar"
thành foo() . "bar"
. Nếu danh mục này không được kích hoạt và nếu không có foo
phụ được xác định, thì nó sẽ được phân tích cú pháp là "foo" . "bar"
. Điều này có ý nghĩa đối với một lập trình viên vỏ, nơi tất cả các barewords là chuỗi. Nhưng trong một chương trình Perl, điều này làm tăng đáng kể tải nhận thức của lập trình viên, và không đáng giá.
Tóm tắt: cho các kịch bản đơn giản mà không tối ưu hóa để có thể đọc, strict "vars"
là không thực sự cần thiết. Có một vài trường hợp mà bạn muốn no strict 'refs'
.
Pragma warnings
cho phép kiểm soát hạt mịn đối với các thông báo cảnh báo. Điều này đặc biệt quan trọng đối với các lập trình viên mới đối với Perl, những người thường xuyên viết các nội dung như
my %hash = { foo => 1, bar => 2 };
và tự hỏi mã đó là HASH(0x1234567)
. Thậm chí trên một lớp lót, cảnh báo là mong muốn, ngoại trừ trong trường hợp bạn sử dụng stringification của undef
, vv
Trong một codebase chuyên nghiệp, không có lý do gì để không sử dụng warnings
ở khắp mọi nơi. Nếu kịch bản cảnh báo, rất có thể có lỗi và no warnings
không làm cho lỗi này biến mất.Kiến thức của bạn về Perl không bao giờ lớn bằng kiến thức của pragma warnings
. Ngay cả rất kinh nghiệm cũng mắc lỗi. use warnings
là một phím tắt gỡ lỗi tuyệt vời.
Điều đó nói rằng, có thể là hoàn toàn bình luận khi use warnings
khi triển khai chương trình. Nhưng không bao giờ để phát triển.
Tùy thuộc vào sự đồng thuận trong đội dev, pragmas khác nên được sử dụng cũng như:
no indirect
không cho phép các ghét new Foo
lời gọi phương thức. Tôi đã nhìn thấy lỗi lẻn trong đó có thể đã bị bắt tại thời gian biên dịch với pragma này.
no autovivification
ngăn tham chiếu mọc vào sự tồn tại của các hoạt động chỉ đọc như $hash{doesnt_exist}{foo}
.
Liên quan: http://stackoverflow.com/q/6050031 –
Bật tính năng này có thể dẫn đến ảo giác rằng mã của bạn đã sẵn sàng để sản xuất. –
http://hype-free.blogspot.com/2008/05/my-perl-blog-how-to-turn-off-warnings.html –