Tôi đã thử:
$var = false;
$var = FALSE;
$var = False;
Không ai trong số này làm việc. Tôi nhận được thông báo lỗi
Bareword "sai" không được phép trong khi "phụ nghiêm ngặt" đang được sử dụng.
Tôi đã thử:
$var = false;
$var = FALSE;
$var = False;
Không ai trong số này làm việc. Tôi nhận được thông báo lỗi
Bareword "sai" không được phép trong khi "phụ nghiêm ngặt" đang được sử dụng.
Câu trả lời:
Trong Perl, các đánh giá sau đây là sai trong các điều kiện:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
Phần còn lại là đúng. Không có barewords cho true
hoặc false
.
undef
.
('')
và ''
có cùng giá trị. Tôi nghĩ rằng bạn muốn ám chỉ một danh sách với một thành phần bao gồm một chuỗi rỗng (mặc dù parens không tạo danh sách), nhưng như tôi đã đề cập, không thể kiểm tra xem danh sách đó có đúng không.
!0
aka PL_sv_yes
) và false ( !1
aka PL_sv_no
). Hay bạn đang nói Perl nên uốn éo bất cứ khi nào một cái gì đó ngoài hai giá trị này được kiểm tra tính trung thực? Điều đó sẽ hoàn toàn khủng khiếp. ví dụ: Nó sẽ ngăn chặn$x ||= $default;
Định nghĩa ngắn gọn, đầy đủ nhất về sai mà tôi đã gặp là:
Bất cứ điều gì xâu chuỗi thành chuỗi rỗng hoặc chuỗi
0
là sai. Mọi thứ khác đều đúng.
Do đó, các giá trị sau là sai:
Hãy nhớ rằng một danh sách trống theo nghĩa đen sẽ đánh giá một giá trị không xác định trong ngữ cảnh vô hướng, vì vậy nó đánh giá thành một cái gì đó sai.
Một ghi chú về "số không thực"
Trong khi các số 0
được xâu chuỗi thành sai, các chuỗi số hóa thành 0 không nhất thiết phải có. Các chuỗi sai duy nhất là 0
và chuỗi trống. Bất kỳ chuỗi nào khác, ngay cả khi nó số hóa thành 0, là đúng.
Sau đây là các chuỗi đúng như boolean và 0 dưới dạng số:
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
trả về false. (ví dụ "abc"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
. Bây giờ $value
sẽ xâu chuỗi thành "XXX" nhưng boolify thành false.
bool
chuỗi của bạn 0
. Ngoài ra, bạn không được khuyến khích tạo ra tình trạng quá tải không nhất quán và các giá trị bạn trả về có thể được coi là như vậy. (ví dụ: a &&
có thể được tối ưu hóa thành a ||
, vì vậy nếu những điều này không nhất quán, bạn sẽ gặp vấn đề.)
0x00
được bảo hiểm ở đây.
0x00
(giá trị số 0) hoặc chuỗi 0x00
(cho đó looks_like_number
là sai)? Dù bằng cách nào, nó đã được bảo hiểm.
Perl không có kiểu boolean riêng, nhưng bạn có thể sử dụng so sánh các số nguyên hoặc chuỗi để có cùng hành vi. Ví dụ của Alan là một cách hay để làm điều đó bằng cách sử dụng so sánh các số nguyên. Đây là một ví dụ
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
Một điều mà tôi đã thực hiện trong một số chương trình của mình được thêm vào cùng một hành vi bằng cách sử dụng hằng số:
#!/usr/bin/perl
use strict;
use warnings;
use constant false => 0;
use constant true => 1;
my $val1 = true;
my $val2 = false;
print $val1, " && ", $val2;
if ( $val1 && $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
print $val1, " || ", $val2;
if ( $val1 || $val2 ) {
print " evaluates to true.\n";
} else {
print " evaluates to false.\n";
}
Các dòng được đánh dấu trong "hằng số sử dụng" xác định hằng số có tên true luôn luôn ước tính là 1 và hằng số có tên false luôn luôn đánh giá bằng 0. Do cách các hằng số được định nghĩa trong Perl, các dòng mã sau cũng thất bại:
true = 0;
true = false;
Thông báo lỗi sẽ có nội dung như "Không thể sửa đổi hằng số trong gán vô hướng."
Tôi thấy rằng trong một trong những ý kiến bạn hỏi về việc so sánh các chuỗi. Bạn nên biết rằng vì Perl kết hợp các chuỗi và kiểu số trong các biến vô hướng, nên bạn có cú pháp khác nhau để so sánh các chuỗi và số:
my $var1 = "5.0";
my $var2 = "5";
print "using operator eq\n";
if ( $var1 eq $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
print "using operator ==\n";
if ( $var1 == $var2 ) {
print "$var1 and $var2 are equal!\n";
} else {
print "$var1 and $var2 are not equal!\n";
}
Sự khác biệt giữa các toán tử này là một nguồn gây nhầm lẫn rất phổ biến trong Perl.
use warnings;
thay vì#! perl -w
if ($exitstatus) { exit; }
vs if ($exitstatus == true) { exit; }
, có thể không rõ ràng đối với người quan sát thông thường. (Và vâng, ví dụ cuối cùng là phong cách lập trình kém, nhưng đó là vấn đề bên cạnh).
Tôi đề nghị use boolean;
. Bạn phải cài đặt mô-đun boolean từ cpan.
if ($my_true_value == true)
. Giả vờ rằng có một Sự thật là, theo kinh nghiệm của tôi, một con đường dẫn đến nỗi đau và mã không hiệu quả.
Yêu thích của tôi luôn luôn là
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
đó là hoàn toàn độc lập với các đại diện nội bộ.
Tôi đã xem qua một hướng dẫn có giải thích rõ về giá trị nào là đúng và sai trong Perl . Nó nói rằng:
Các giá trị vô hướng sau được coi là sai:
undef
- giá trị không xác định0
số 0, ngay cả khi bạn viết nó là 000 hoặc 0,0''
chuỗi rỗng.'0'
chuỗi chứa một chữ số 0 duy nhất.Tất cả các giá trị vô hướng khác, bao gồm các giá trị sau là đúng:
1
bất kỳ số nào không 0' '
chuỗi có khoảng trắng trong đó'00'
hai hoặc nhiều 0 ký tự trong một chuỗi"0\n"
0 theo sau là một dòng mới'true'
'false'
có, ngay cả chuỗi 'false' cũng đánh giá là đúng.Có một hướng dẫn tốt khác giải thích về Perl đúng và sai .
Giải thích tuyệt vời được đưa ra bởi bobf cho các giá trị Boolean: Đúng hay Sai? Hướng dẫn tham khảo nhanh
Kiểm tra sự thật cho các giá trị khác nhau
Result of the expression when $var is:
Expression | 1 | '0.0' | a string | 0 | empty str | undef
--------------------+--------+--------+----------+-------+-----------+-------
if( $var ) | true | true | true | false | false | false
if( defined $var ) | true | true | true | true | true | false
if( $var eq '' ) | false | false | false | false | true | true
if( $var == 0 ) | false | true | true | true | true | true
sử dụng tiền tố tập tin sau, điều này sẽ thêm vào tập lệnh perl của bạn eTRUE và eFALSE, nó thực sự sẽ là REAL (!) đúng và sai (giống như java)
#!/usr/bin/perl
use strict;
use warnings;
use constant { #real true false, compatible with encode_json decode_json for later (we don't want field:false... will be field:0...)
eTRUE => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
eFALSE => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' )
};
Thực tế, có vài lý do tại sao bạn nên sử dụng nó.
Lý do của tôi là khi làm việc với JSON, tôi đã nhận 0 và 1 làm giá trị cho các khóa, nhưng bản hack này sẽ đảm bảo các giá trị chính xác được giữ theo tập lệnh của bạn.