私が試してみました:
$var = false;
$var = FALSE;
$var = False;
これらのどれも機能しません。エラーメッセージが表示されます
「strict subs」が使用されている間は、裸の「false」は許可されません。
Perl では、次の条件は false と評価されます。
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
残りは真実です。true
orには裸の言葉はありませんfalse
。
私が遭遇した false の最も完全で簡潔な定義は次のとおりです。
空の文字列または文字列に文字列化されるものはすべて
0
false です。他のすべては真実です。
したがって、次の値は false です。
空のリスト リテラルは、スカラー コンテキストで未定義の値に評価されるため、false に評価されることに注意してください。
「真のゼロ」に関する注意
文字列化された数値0
は false ですが、数値化されてゼロになる文字列は必ずしも false ではありません。唯一の偽の文字列は0
、空の文字列です。それ以外の文字列は、数値化してゼロになったとしても true です。
以下は、ブール値として true で、数値として 0 である文字列です。
"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 という名前の定数を定義します。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 constant FALSE => 1==0;
use constant TRUE => not FALSE;
これは内部表現から完全に独立しています。
私はお勧めしuse boolean;
ます。ただし、cpan からbooleanモジュールをインストールする必要があります。
Perl でどの値が true と false であるかについて十分に説明されているチュートリアルに出くわしました。それは次のように述べています:
次のスカラー値は false と見なされます。
undef
- 未定義の値0
000 や 0.0 と書いても数字の 0''
空の文字列。'0'
単一の 0 数字を含む文字列。以下を含む他のすべてのスカラー値は true です。
1
0 以外の数値' '
スペースを含む文字列'00'
文字列に 2 つ以上の 0 文字"0\n"
0 の後に改行'true'
'false'
はい、文字列 'false' でさえ true に評価されます。Perl の true と falseについて説明する別の優れたチュートリアルがあります。
Raku (以前は Perl_6 として知られていたプログラミング言語) のブール値:
~$ raku
Welcome to ™ v2021.06.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2021.06.
To exit type 'exit' or '^D'
> my $var = False;
False
> say $var;
False
> say $var.^name
Bool
> say $var.WHAT
(Bool)
> say ++$var
True
> say --$var
False
> say $var.Int
0
> say $var.Int + 1
1
> say ($var.Int + 1).Bool
True
> say $var.Int - 1
-1
> say ($var.Int - 1).Bool
True
> say $var.succ
True
> say $var.Int.succ
1
> say $var.pred
False
> say $var.Int.pred
-1
> say ++($var.Int); #ERROR
Cannot resolve caller prefix:<++>(Int:D); the following candidates
match the type but require mutable arguments:
(Mu:D $a is rw)
(Int:D $a is rw --> Int:D)
#<SNIP>
> say --($var.Int); #ERROR
Cannot resolve caller prefix:<-->(Int:D); the following candidates
match the type but require mutable arguments:
(Mu:D $a is rw)
(Int:D $a is rw --> Int:D)
#<SNIP>
> exit
https://docs.raku.org/type/Bool https://docs.raku.org/language/syntax#index-entry-Boolean_(
リテラル)