2011-06-18 9 views
8

Bạn sử dụng safety net nào?Bạn sử dụng mạng lưới an toàn nào ở Perl?

sử dụng cảnh báo;

hoặc

sử dụng nghiêm ngặt;

Tôi biết rằng

Một vấn đề tiềm năng đánh bắt bằng cách sử dụng nghiêm ngặt; sẽ làm cho mã của bạn dừng lại ngay khi gặp phải, trong khi sử dụng cảnh báo; sẽ chỉ đưa ra cảnh báo (như công tắc dòng lệnh -w) và để mã của bạn chạy.

Tôi vẫn muốn biết phần mềm nào được sử dụng chủ yếu bởi các lập trình viên Perl. Cái nào họ thấy được sử dụng nhiều nhất?

+0

Lý do bỏ phiếu? –

+2

Tôi không bỏ phiếu để đóng, nhưng tôi nghi ngờ đó là bởi vì cảnh báo và nghiêm ngặt làm những việc hoàn toàn khác nhau. Nó không phải là một trong hai hoặc câu hỏi - sử dụng cả hai. –

+0

Cảm ơn bạn đã chỉnh sửa. [@ starblue: để chỉnh sửa tiêu đề và @tchrist để thêm thẻ phụ] –

Trả lời

13

use strict tạo ra lỗi nếu bạn sử dụng tham chiếu tượng trưng (ví dụ: chuỗi để biểu thị tên biểu tượng). Nó tạo ra một lỗi nếu bạn sử dụng một biến mà không khai báo nó (điều này khuyến khích việc sử dụng các biến 'l2ical' my 'lexical, nhưng cũng hài lòng nếu bạn khai báo đúng gói globals). Nó cũng tạo ra một lỗi nếu bạn để lại các barewords treo xung quanh trong kịch bản (chuỗi unquoted, về cơ bản, theo định nghĩa của Perl của dấu ngoặc kép). Với 'strict', bạn có thể bật hoặc tắt bất kỳ loại nào trong số ba loại độ nghiêm ngặt và tôi làm như vậy trong các khối có phạm vi. Đó là cách thực hành tốt nhất để cho phép các mức độ nghiêm ngặt, mặc dù thỉnh thoảng mã hợp pháp yêu cầu một số tính năng của nó bị tắt cục bộ. Tuy nhiên, người ta phải suy nghĩ lâu dài và khó khăn về việc liệu điều này có thực sự cần thiết hay không và liệu giải pháp của họ có lý tưởng hay không. Bạn có thể đọc về độ nghiêm ngặt trong POD của Perl được gọi là 'nghiêm ngặt'.

use warnings tạo thông điệp cảnh báo dựa trên nhiều tiêu chí, được mô tả trong POD 'perllexwarn'. Những cảnh báo này không liên quan gì đến việc phải tuân thủ các quy định nghiêm ngặt, mà đúng hơn là, hãy theo dõi "người dùng" phổ biến nhất có khả năng gặp phải trong lập trình của họ. Cách tốt nhất là sử dụng cảnh báo khi viết kịch bản. Trong một số trường hợp, thư có thể không mong muốn, một danh mục cảnh báo nhất định có thể bị tắt cục bộ trong phạm vi. Thông tin bổ sung được mô tả trong 'cảnh báo'.

use diagnostics làm cho các cảnh báo tiết lộ chi tiết hơn, và trong môi trường phát triển hoặc học tập, đặc biệt là trong số những người mới đến, điều đó rất mong muốn. Chẩn đoán có lẽ sẽ bị loại bỏ khỏi 'sản phẩm cuối cùng', nhưng trong khi phát triển chúng có thể là một bổ sung thực sự tốt cho các thông điệp ngắn được tạo ra bình thường. Bạn có thể đọc về chẩn đoán trong chẩn đoán của Perl POD "."

Không có lý do gì để buộc bản thân chỉ sử dụng một trong các tùy chọn trên hoặc cách khác. Đặc biệt, sử dụng cảnh báo và sử dụng nghiêm ngặt nên nói chung cả hai đều được sử dụng trong các chương trình Perl hiện đại.

Trong mọi trường hợp (ngoại trừ chẩn đoán, bạn chỉ sử dụng để phát triển), các cảnh báo hoặc cảnh báo riêng lẻ có thể bị vô hiệu hóa. Hơn nữa, lỗi của chúng có thể bị mắc kẹt với eval{ .... }, với các khối try/catch của Try::Tiny và một số cách khác. Nếu có một mối quan tâm về một tin nhắn cho một kẻ tấn công tiềm năng thêm thông tin về một kịch bản, các tin nhắn có thể được chuyển đến một logfile. Nếu có một nguy cơ cho biết rất nhiều logfile tiêu thụ không gian, có một vấn đề lớn hơn trong tầm tay, và nguồn gốc của vấn đề nên được giải quyết hoặc trong một số trường hợp hiếm hoi chỉ đơn giản là có tin nhắn bị vô hiệu hóa.

Chương trình Perl hiện nay phải tuân thủ nghiêm ngặt/cảnh báo là một phương pháp hay nhất.

+0

Được giải thích rõ ràng. +1 Cảm ơn bạn :) –

20

Cả hai, tất nhiên. Nếu perl được thiết kế ngày nay, sử dụng các cảnh báo nghiêm ngặt và sử dụng sẽ là hành vi mặc định. Nó giống như có cảnh báo bật trong một trình biên dịch - tại sao bạn sẽ không làm điều đó theo mặc định?

+0

Nó giống như có cảnh báo được bật trong trình biên dịch. +1 Cảm ơn :) –

+1

'không nghiêm ngặt;' sẽ là xấu đối với chơi gôn mã? :) – geoffspear

11

Sử dụng cả hai, như trang được liên kết cho biết.

Tài liệu có thể không rõ ràng chút nào. use strictuse warnings gặp các sự cố khác nhau; use strict sẽ không làm cho chương trình của bạn thoát ngay lập tức khi chỉ gặp phải các cảnh báo, chỉ khi bạn vi phạm các yêu cầu cú pháp nghiêm ngặt. Bạn sẽ vẫn nhận được cảnh báo chỉ được in khi mã của bạn làm những việc ít nghiêm trọng hơn.

+0

sử dụng nghiêm ngặt sẽ không làm cho chương trình của bạn ngay lập tức thoát ra khi chỉ cảnh báo gặp phải. Cảm ơn bạn đã cung cấp thông tin này :) +1 –

5
use strict; 
#use warnings; 
use diagnostics; # "This module extends the terse diagnostics..." by http://perldoc.perl.org/diagnostics.html 

Cả hai! Nhưng tôi thích chẩn đoán, thay vì cảnh báo, cung cấp cho bạn thêm thông tin.

+1

Có vấn đề gì với chẩn đoán không ?! Tôi nhận được một số phản hồi tiêu cực với câu trả lời này! – cirne100

+2

Đó là một điều tốt, cảm ơn :) +1 –

+6

chẩn đoán có thể là quá mức cần thiết cho các mục đích của OP (một mạng lưới an toàn), nhưng đó không thực sự là một lý do để downvote. – ikegami

14

Điều bạn thậm chí không bắt đầu là đủ.

Tôi sử dụng mã xấp xỉ này làm điểm bắt đầu. Nó hoạt động tốt trong môi trường của tôi, mặc dù như luôn luôn mileage của bạn có thể khác nhau.

#!/usr/bin/env perl 

use v5.12; 
use utf8; 
use strict; 
use autodie; 
use warnings; 
use warnings qw< FATAL utf8  >; 
use feature  qw<unicode_strings>; 
use open  qw< :std :utf8  >; 
use charnames qw< :full   >; 

# These are core modules: 
use Carp    qw< carp croak confess cluck >; 
use File::Basename  qw< basename  dirname >; 
use Unicode::Normalize qw< NFD NFKD  NFC NFKC >; 
use Getopt::Long  qw< GetOptions    >; 
use Pod::Usage   qw< pod2usage    >; 

our $VERSION = v0.0.1; 

$0 = basename($0); # shorter messages 
## $| = 1; 

$SIG{__DIE__} = sub { 
    confess "Uncaught exception: @_" unless $^S; 
}; 

$SIG{__WARN__} = sub { 
    if ($^S) { cluck "Trapped warning: @_" } 
    else  { confess "Deadly warning: @_" } 
}; 

END { 
    local $SIG{PIPE} = sub { exit }; 
    close STDOUT; 
} 

if (grep /\P{ASCII}/ => @ARGV) { 
    @ARGV = map { decode("UTF-8", $_) } @ARGV; 
} 

binmode(DATA, ":utf8"); 

## Getopt::Long::Configure qw[ bundling auto_version ]; 

if ([email protected] && -t STDIN) { 
    print STDERR "$0: reading from stdin: type ^D to end, ^C to kill...\n"; 
} 

while (<>) { 
    $_ = NFD($_); 
    # ... 
    print NFC($_); 
} 

exit; 

=pod 

=encoding utf8 

=head1 NAME 

=head1 SYNOPSIS 

=head1 DESCRIPTION 

=head1 OPTIONS 

=head1 EXAMPLES 

=head1 ERRORS 

=head1 FILES 

=head1 ENVIRONMENT 

=head1 PROGRAMS 

=head1 AUTHOR 

=head1 COPYRIGHT AND LICENCE 

=head1 REVISION HISTORY 

=head1 BUGS 

=head1 TODO 

=head1 SEE ALSO 

=cut 

__END__ 

Your UTF-8 data goes here. 

Bạn có thể tìm thêm ví dụ về các loại điều này trong hành động trong Perl Unicode Tool Chest, hiện lên đến khoảng 50 file khác nhau, từ đơn giản đến tuyệt vời.

+2

Tất nhiên đây là câu trả lời sẽ nhận được tất cả các upvotes. :) Một trong những caveat tôi có thể đề nghị là để thực sự đọc và tìm hiểu lý do tại sao Tom sử dụng từng công cụ này hơn là chỉ mù quáng cắt và dán. Tôi không thể nói rằng tôi hiểu tất cả chúng, vì vậy nó mang lại cho tôi một cái gì đó để đi sâu vào cũng. – DavidO

+0

Có lý do nào cho sự hiện diện của cả hai 'sử dụng v5.12;' và 'sử dụng nghiêm ngặt;'? Tôi nghĩ rằng 'sử dụng nghiêm ngặt;' được ngầm định trong 'sử dụng v5.12;'. –

+0

Vâng, một lý do có thể là vì lợi ích của những người đọc ít hiểu biết hơn. Tôi đã không sử dụng Perl trên 5.10 vì vậy tôi thậm chí không nhận thức được tính năng đó trong 5.12! – Dan