回答:
Perlでは、次の条件式でfalseと評価されます。
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
残りは本当です。trueまたはの裸語はありませんfalse。
undef。
('')と''は同じ値です。空の文字列で構成される要素を持つリストを暗示する必要があると思いますが(括弧でリストを作成しない場合でも)、既に述べたように、リストがtrueであるかfalseであるかを確認することは不可能です。
!0別名PL_sv_yes)とfalse(!1別名PL_sv_no)があります。それとも、これら2つの値以外の何かが真実かどうかテストされるときはいつでも、Perlは鳴き声を鳴らすべきだと言っていますか?それは完全にひどいでしょう。例:阻止する$x ||= $default;
私が遭遇した最も完全で簡潔なfalseの定義は次のとおりです。
空の文字列または文字列に文字列化するもの
0はすべてfalseです。他のすべては本当です。
したがって、次の値はfalseです。
空のリストリテラルはスカラーコンテキストで未定義の値に評価されるため、何かがfalseに評価されることに注意してください。
「真のゼロ」に関するメモ
文字0列化する数値は偽ですが、ゼロに数値化する文字列は必ずしもそうではありません。唯一の偽の文字列は0空の文字列です。他の文字列は、たとえそれがゼロに数値化されたとしても、真です。
以下は、ブール値として真、数値としてゼロの文字列です。
"0.0""0E0""00""+0""-0"" 0""0\n"".0""0.""0 but true""\t00""\n0e1""+0.e-9"Scalar::Util::looks_like_numberfalse を返す文字列。(例"abc")my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };。今度$valueは「XXX」に文字列化されますが、偽にブール化されます。
boolはに文字列化されることに注意してください0。また、一貫性のないオーバーロードを作成しないことをお勧めします。返される値はそのようなものと見なすことができます。(たとえば、&&をに最適化できる||ため、これらが一貫していない場合、問題が発生します。)
0x00ここでカバーされているかどうかはわかりません。
0x00(数値ゼロ)または文字列0x00(looks_like_numberfalse)によって返される値を意味しますか?いずれにせよ、それはすでにカバーされています。
Perlにはネイティブのブール型はありませんが、整数または文字列の比較を使用して同じ動作を得ることができます。アランの例は、整数の比較を使用してそれを行う良い方法です。ここに例があります
my $boolean = 0;
if ( $boolean ) {
print "$boolean evaluates to true\n";
} else {
print "$boolean evaluates to false\n";
}
一部のプログラムで行ったことの1つは、定数を使用して同じ動作を追加することです。
#!/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";
}
「use constant」でマークされた行は、常に1と評価されるtrueという名前の定数と、常に0で評価されるfalseという名前の定数を定義します。Perlでの定数の定義方法により、次のコード行も失敗します。
true = 0;
true = false;
エラーメッセージには、「スカラー割り当てで定数を変更できません」のようなメッセージが表示されます。
文字列の比較について尋ねたコメントの1つでそれを見ました。Perlは文字列と数値型をスカラー変数に組み合わせるので、文字列と数値を比較するための構文が異なることを知っておく必要があります。
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";
}
これらの演算子の違いは、Perlで非常に一般的な混乱の原因です。
use warnings;代わりに#! perl -w
if ($exitstatus) { exit; }vs if ($exitstatus == true) { exit; }は、何気ない観察者には明らかでない場合があります。(そして、はい、最後の例は貧弱なプログラミングスタイルですが、それは要点を外しています)。
お勧めuse boolean;です。ただし、cpanからbooleanモジュールをインストールする必要があります。
if ($my_true_value == true)。私の経験では、One True Truthがあると偽ることは、苦痛への道であり、非効率的なコードです。
私のお気に入りはいつもされています
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
これは内部表現から完全に独立しています。
Perlでtrueとfalseがどのような値であるかについてよく説明されているチュートリアルに出くわしました。それは述べています:
次のスカラー値はfalseと見なされます。
undef -未定義の値0 000または0.0と記述した場合でも、数値0'' 空の文字列。'0' 1つの0桁を含む文字列。以下を含む他のすべてのスカラー値はtrueです。
1 0以外の数値' ' スペースを含む文字列'00' 文字列内の2つ以上の0文字"0\n" 0とそれに続く改行'true''false' はい、文字列 'false'でもtrueと評価されます。Perlのtrueとfalseについて説明する別の優れたチュートリアルがあります。
ブール値に対してbobfによって与えられた美しい説明: TrueまたはFalse?クイックリファレンスガイド
さまざまな値の真理テスト
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
次のファイル接頭辞を使用してください。これにより、PerlスクリプトにeTRUEおよびeFALSEが追加され、実際にはREAL(!)trueおよびfalse(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' )
};
実際に使用する理由はいくつかあります。
私の理由は、JSONを使用して、キーの値として0と1を取得していることですが、このハックにより、スクリプトに沿って正しい値が保持されます。