Rõ ràng use strict
nên (phải) được sử dụng khi bạn muốn buộc perl phải viết mã đúng cách, điều này có thể buộc phải khai báo, rõ ràng trên các chuỗi và phụ, tức là từ khóa hoặc sử dụng refs một cách thận trọng. Lưu ý: nếu có lỗi sử dụng nghiêm ngặt sẽ hủy thực hiện nếu sử dụng.
Mặc dù use warnings;
sẽ giúp bạn tìm ra các lỗi nhập trong chương trình như bạn bỏ sót dấu chấm phẩy, bạn đã sử dụng 'elseif' chứ không phải 'elsif', bạn đang sử dụng cú pháp hoặc hàm không dùng nữa, bất cứ điều gì tương tự. Lưu ý: cảnh báo sử dụng sẽ chỉ cung cấp cảnh báo và tiếp tục thực thi, tức là sẽ không hủy bỏ việc thực thi ..
Dù sao, sẽ tốt hơn nếu chúng ta đi vào chi tiết, mà tôi đang suy đoán bên dưới
Từ perl.com (yêu thích của tôi):
sử dụng 'vars' nghiêm ngặt;
có nghĩa là bạn phải luôn khai báo các biến trước khi sử dụng chúng.
Nếu bạn không khai báo, bạn có thể sẽ nhận được thông báo lỗi cho biến chưa được khai báo
Ký hiệu chung "$ variablename" yêu cầu tên gói rõ ràng tại dòng 3 scriptname.pl
Cảnh báo này có nghĩa là Perl không rõ ràng chính xác về phạm vi của biến là gì. Vì vậy, bạn cần phải rõ ràng về các biến của mình, có nghĩa là khai báo chúng bằng my
để chúng bị hạn chế trong khối hiện tại hoặc đề cập đến chúng với tên đủ điều kiện của chúng (ví dụ: $ MAIN :: tên biến).
Vì vậy, lỗi thời gian biên dịch được kích hoạt nếu bạn cố gắng truy cập vào một biến không đáp ứng ít nhất một trong các tiêu chí sau:
Được xác định trước bởi chính Perl, chẳng hạn như @ARGV,% ENV và tất cả các biến dấu câu chung như $. hoặc $ _.
Được khai báo với của chúng tôi (đối với toàn cầu) hoặc của tôi (đối với từ vựng).
Đã nhập từ gói khác. (Việc sử dụng vars pragma giả mạo quá trình nhập, nhưng thay vào đó hãy sử dụng của chúng tôi.)
Hoàn toàn đủ điều kiện sử dụng tên gói của nó và dấu phân tách gói bằng dấu hai chấm.
sử dụng 'subs' nghiêm ngặt;
Hãy xem xét hai chương trình
# prog 1
$a = test_value;
print "First program: ", $a, "\n";
sub test_value { return "test passed"; }
Output: First program's result: test_value
# prog 2
sub test_value { return "test passed"; }
$a = test_value;
print "Second program: ", $a, "\n";
Output: Second program's result: test passed
Trong cả hai trường hợp, chúng tôi có một test_value () con và chúng tôi muốn đặt kết quả của nó vào $ a. Tuy nhiên, khi chúng tôi chạy hai chương trình, chúng tôi nhận được hai kết quả khác nhau:
Trong chương trình đầu tiên, tại thời điểm chúng ta đến $a = test_value;
, Perl không biết bất kỳ con test_value () nào và test_value được hiểu là chuỗi 'test_value'. Trong chương trình thứ hai, định nghĩa của test_value () đứng trước $a = test_value;
dòng. Perl nghĩ rằng test_value là cuộc gọi phụ.
Thuật ngữ kỹ thuật cho các từ riêng biệt như test_value có thể là phụ và có thể là chuỗi tùy thuộc vào ngữ cảnh, nhân tiện, là từ trần . Việc xử lý từ trần của Perl có thể khó hiểu và nó có thể gây ra lỗi trong chương trình.
Lỗi là những gì chúng tôi gặp phải trong chương trình đầu tiên của mình, Hãy nhớ rằng Perl sẽ không mong đợi để tìm thấy test_value()
, vì vậy vì nó chưa thấy test_value (), nó giả định rằng bạn muốn một chuỗi. Vì vậy, nếu bạn use strict subs;
, nó sẽ khiến chương trình này chết với lỗi:
Không cho phép sử dụng từ trần "test_value" trong khi "đăng ký nghiêm ngặt" được sử dụng tại ./a6-strictsubs.pl dòng 3.
Giải pháp cho lỗi này sẽ là
1. Sử dụng dấu ngoặc đơn để làm rõ rằng bạn đang gọi một phụ. Nếu Perl thấy $ a = test_value () ;,
2. Khai báo phụ của bạn trước khi bạn sử dụng lần đầu
use strict;
sub test_value; # Declares that there's a test_value() coming later ...
my $a = test_value; # ...so Perl will know this line is okay.
.......
sub test_value { return "test_passed"; }
3. Và Nếu bạn muốn sử dụng nó như một chuỗi, hãy trích dẫn nó.
Vì vậy, sự nghiêm ngặt này khiến Perl coi tất cả các từ khóa trần là lỗi cú pháp. * Một bareword là bất kỳ tên trần hoặc nhận dạng mà không có sự giải thích khác buộc bởi hoàn cảnh. (Ngữ cảnh thường bị ép buộc bởi một từ khóa hoặc mã thông báo gần đó, hoặc bằng cách khai báo trước từ được đề cập.) * Vì vậy, Nếu bạn muốn sử dụng nó như một chuỗi, hãy trích dẫn nó và nếu bạn muốn sử dụng nó như một lệnh gọi hàm, hãy khai báo trước nó hoặc sử dụng dấu ngoặc đơn.
Bareword rất nguy hiểm vì hành vi không thể đoán trước này. use strict; (or use strict 'subs';)
làm cho chúng có thể dự đoán được, bởi vì các từ trần có thể gây ra hành vi kỳ lạ trong tương lai sẽ khiến chương trình của bạn chết trước khi chúng có thể tàn phá
Có một nơi mà bạn có thể sử dụng từ trần ngay cả khi bạn đã bật đăng ký nghiêm ngặt: khi bạn chỉ định khóa băm.
$hash{sample} = 6; # Same as $hash{'sample'} = 6
%other_hash = ( pie => 'apple' );
Mật khẩu trong khóa băm luôn được hiểu là chuỗi ký tự, do đó không có sự mơ hồ.
sử dụng 'refs' nghiêm ngặt;
Điều này tạo ra lỗi thời gian chạy nếu bạn sử dụng tham chiếu tượng trưng, cố ý hoặc theo cách khác. Sau đó, một giá trị không phải là một tham chiếu cứng được coi là một tham chiếu tượng trưng . Tức là, tham chiếu được hiểu là một chuỗi biểu diễn tên của một biến toàn cục.
use strict 'refs';
$ref = \$foo; # Store "real" (hard) reference.
print $$ref; # Dereferencing is ok.
$ref = "foo"; # Store name of global (package) variable.
print $$ref; # WRONG, run-time error under strict refs.
cảnh báo sử dụng;
Pragma có phạm vi từ vựng này cho phép kiểm soát linh hoạt các cảnh báo có sẵn của Perl, cả những cảnh báo được phát ra bởi trình biên dịch cũng như những cảnh báo từ hệ thống thời gian chạy.
Từ perldiag
:
Vì vậy, phần lớn các thông báo cảnh báo từ các phân loại dưới đây, tức là W, D & S có thể được kiểm soát bằng warnings
pragma.
(W) Cảnh báo (tùy chọn)
(D) Không dùng nữa (được bật theo mặc định)
(S) Cảnh báo nghiêm trọng (được bật theo mặc định)
Tôi đã liệt kê một số thông báo cảnh báo thường xảy ra bên dưới theo phân loại. Để biết thông tin chi tiết về chúng và những tin nhắn khác, hãy tham khảo perldiag
(W) Một cảnh báo (tùy chọn):
Thiếu đối số trong% s
Thiếu đối số thành -% c
(Ý của bạn là &% s?)
(Ý của bạn là "local" thay vì "our"?)
(Ý của bạn là $ hoặc @ thay vì%?)
% S 'không phải là
độ dài tham chiếu mã () được sử dụng trên% s
Misplaced _ in number
(D) Không dùng nữa (được bật theo mặc định):
đã xác định (@array) không được chấp nhận
được xác định (% băm) không được dùng
nữa Việc sử dụng () của tôi trong điều kiện sai
$ # không còn được hỗ trợ nữa
(S) Cảnh báo nghiêm trọng (được bật theo mặc định)
elseif nên được
tìm thấy elsif % s ở vị trí mà toán tử mong đợi
(Thiếu toán tử trước% s?)
(Thiếu dấu chấm phẩy ở dòng trước?)
% s chưa bao giờ được giới thiệu
Toán tử hoặc thiếu dấu chấm phẩy trước% s
Vấn đề ưu tiên: mở% s nên mở (% s)
Nguyên mẫu không khớp:% s so với% s
Cảnh báo: Việc sử dụng "% s" không có dấu ngoặc đơn là không rõ ràng
Không thể mở% s:% s
use loose;