私が試してみました:
$var = false;
$var = FALSE;
$var = False;
これらのどれも動作しません。エラーメッセージが出ます
"strict subs"が使用されている間は、 "false"は使用できません。
Perlでは、次の条件式ではfalseと評価されます。
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
残りは本当です。 true
またはfalse
に必要な語はありません。
私が遭遇した偽の最も完全で簡潔な定義は、次のとおりです。
空の文字列または文字列 `0`に文字列化するものはすべて偽です。他のすべては本当です。
したがって、次の値は偽です。
空のリストリテラルはスカラコンテキストでは未定義の値に評価されるので、偽に評価されることに注意してください。
「真のゼロ」に関するメモ
0
に文字列化する数値はfalseですが、数値ゼロにする文字列は必ずしもそうとは限りません。唯一の偽の文字列は0
と空文字列です。ゼロに数値化されていても、他の文字列はすべてtrueです。
以下は、ブール値として真、数値としてゼロの文字列です。
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
がfalseを返す対象の任意の文字列。 (例:"abc"
)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という名前の定数を定義しています。
true = 0;
true = false;
エラーメッセージは、「スカラー代入で定数を変更できない」のようなものを言う必要があります。
私はあなたが文字列の比較についてあなたが尋ねたコメントの一つでそれを見ました。 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 boolean;
をお勧めします。ただし、cpanから boolean モジュールをインストールする必要があります。
私のお気に入りはいつもされています
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
これは内部表現から完全に独立しています。
私は チュートリアル に出会いました。これはPerlについてどのような値が正しいか間違っているかについて説明しています。それは述べています:
次のスカラー値はfalseと見なされます。
undef
- 未定義の値0
は、たとえあなたが000または0.0と書いたとしても、0です。''
は空の文字列です。'0'
は、単一の0桁を含むストリングです。次のものを含め、他のすべてのスカラー値は当てはまります。
1
0以外の数値' '
スペースを含む文字列'00'
文字列中に0文字以上"0\n"
a 0とそれに続く改行'true'
'false'
はい、文字列 'false'でもtrueと評価されます。Perlの真と偽 について説明している別の良いチュートリアルがあります。
ブール値についての 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を得たからです。しかし、このハックは正しい値があなたのスクリプトに沿って保たれることを確実にするでしょう。