Tại sao tất cả các mô-đun Perl 5 phải kết thúc bằng 1;
?Tại sao bạn phải đặt 1; ở cuối mô-đun Perl 5?
Trả lời
Mô-đun Perl phải kết thúc bằng giá trị thực hoặc nếu không được coi là không đã được tải. Theo quy ước, giá trị này thường là 1 mặc dù nó có thể là bất kỳ giá trị thực nào. Một mô-đun có thể kết thúc bằng sai để chỉ báo lỗi nhưng điều này hiếm khi được sử dụng và thay vào đó sẽ chết() (thoát với lỗi).
nguồn: wiki
Tôi đã thấy ''false';' được sử dụng trước như là giá trị thực ... :) – plusplus
Dominus once [quipped] (http://groups.google.com/group/comp.lang.perl.misc/msg/a95715144dccec82?hl=en), “Tôi rất hiếm khi được sử dụng… [' 'Cogito ergo sum'; '] (http: // perl. plover.com/qotw/misc/r006/TestExpand.pm) mà mọi người đều biết là tự hiển nhiên trong tất cả các vũ trụ có thể. Điều này đảm bảo tính di động tối đa. ” –
Điều này không trả lời câu hỏi: _why_ phải là một mô đun kết thúc bằng giá trị thực? – flies
Đó là bởi vì use Module LIST;
tương đương với BEGIN { require Module; Module->import(LIST); }
(xem perldoc -f use)
Riêng require Module;
có thể được thực hiện với các bit mã sau đây (từ perldoc -f require):
sub require {
my ($filename) = @_;
if (exists $INC{$filename}) {
return 1 if $INC{$filename};
die "Compilation failed in require";
}
my ($realfilename,$result);
ITER: {
foreach $prefix (@INC) {
$realfilename = "$prefix/$filename";
if (-f $realfilename) {
$INC{$filename} = $realfilename;
$result = do $realfilename; ## HERE
last ITER;
}
}
die "Can't find $filename in \@INC";
}
if ([email protected]) {
$INC{$filename} = undef;
die [email protected];
} elsif (!$result) { ## AND HERE
delete $INC{$filename};
die "$filename did not return true value";
} else {
return $result;
}
}
Xem số do $realfilename
? Nhìn vào perldoc -f do, và bạn sẽ thấy rằng nó tương đương, khá nhiều, trong số eval system("cat $realfilename")
, về cơ bản có nghĩa là slurp tệp và đánh giá nó.
Nhìn vào perldoc -f eval sản lượng: "Trong cả hai biểu mẫu, giá trị được trả về là giá trị của biểu thức cuối cùng được đánh giá bên trong chương trình mini". Đó là, câu lệnh cuối cùng trong tệp.
Đó là giá trị đề cập rằng nếu "tuyên bố" cuối cùng là một tuyên bố chương trình con, điều đó không phải là một giá trị đúng:
$ perl -le'$r = eval "sub a {1}"; print $r ? "true" : "false"'
false
Trong khi một 1;
sau nó:
$ perl -le'$r = eval "sub a {1} 1"; print $r ? "true" : "false"'
true
Nhìn một lần nữa tại số sub require
ở trên và với kiến thức về những gì require
và do
, số $result
rằng trả lại do $realfilename
thực sự là tuyên bố cuối cùng eval
được chỉnh sửa từ tệp, đó thực sự là câu lệnh cuối cùng trong tệp.
Nếu tuyên bố cuối cùng không phải là giá trị thực, thì ## AND HERE
elsif()
Tôi đánh dấu sẽ được gọi và require
sẽ chết vì mô-đun không trả về giá trị thực. Các use Module
cũng sẽ chết, vì nó làm một require
đằng sau hậu trường.
Ngắn câu chuyện dài, không quan trọng bạn kết thúc tệp nào, miễn là đó là giá trị được hiểu là true
bởi perl. Các mẫu trên tự nhiên (CPAN) bao gồm 1;
, mặc dù một số ngày này kết thúc tệp của chúng trong 1
(không có dấu chấm phẩy bị thiếu) và những người khác chỉ sử dụng các công cụ như '0 but true';
hoặc 'supercalifragilisticexpiralidous';
, tất cả đều được phân tích là giá trị "lơ lửng" của Perl.
Hy vọng điều trên là sự hài lòng của bạn;)
Hacking vui vẻ!
- 1. Tại sao không phải là [1..5] == [1,2,3,4,5]?
- 2. tại sao đặt "const" ở cuối?
- 3. Perl: Tại sao không đánh giá '/(...)/' đặt $ 1?
- 4. Tại sao bạn cần dấu gạch chéo ở cuối URL?
- 5. Tại sao Perl thay chuỗi của tôi bằng "1"?
- 6. Tại sao mã thoát 255 thay vì -1 trong Perl?
- 7. (-1 >> 1) == -1 - Tại sao?
- 8. Tại sao bạn có thể có dấu phẩy ở cuối bộ khởi tạo bộ sưu tập?
- 9. Tại sao tham số tùy chọn phải xuất hiện ở cuối khai báo
- 10. Tại sao chúng ta cần đặt const ở cuối đầu của hàm nhưng tĩnh lúc đầu?
- 11. Tại sao các tập lệnh nội tuyến chặn hiển thị khi đặt ở cuối trang?
- 12. Tại sao resultCode = -1 ở đây sau StartActivityForResult?
- 13. Tại sao một truy vấn sql có "ở đâu 1 = 1"
- 14. Tại sao biến Perl cần phải bắt đầu bằng $,%, @ (sigils)?
- 15. Sự khác nhau giữa 1..5, [* 1..5] và [1..5] trong Groovy là gì?
- 16. Tại sao nguyên mẫu chức năng của Perl 5 là xấu?
- 17. Dấu chấm phẩy Perl ở cuối câu lệnh
- 18. Quy ước đặt tên: Tại sao mảng # xóa không có dấu chấm than ở cuối?
- 19. Tại sao mcrypt_encrypt() đặt ký tự nhị phân ở cuối chuỗi của tôi?
- 20. Tại sao đề xuất có dòng trống ở cuối tệp?
- 21. Tại sao ngữ pháp LR (1) này không phải là LALR (1)?
- 22. tại sao Integer.MAX_VALUE + 1 == Integer.MIN_VALUE?
- 23. Tại sao đặt subStatusCode thành -1 trong Web.config?
- 24. Toán tử "HOẶC" phải được đặt ở cuối dòng trước? (TOROP không mong muốn)
- 25. Tại sao bạn cần đặt #!/Bin/bash ở đầu tập lệnh?
- 26. Tại sao ~ 0 là -1?
- 27. Tại sao truy cập MS boolean đúng -1 chứ không phải 1 hoặc đúng?
- 28. Tại sao chúng ta phải đặt biến __block thành nil?
- 29. bạn đặt ivysettings.xml ở đâu?
- 30. đặt hình nền ở giữa và lặp lại điểm ảnh cuối cùng sang trái và phải
bản sao có thể có của [Điều gì xảy ra 1; có nghĩa là trong Perl?] (http: // stackoverflow.com/questions/1940182/what-does-1-mean-in-perl) – daxim