235

私が試してみました:

$var = false;
$var = FALSE;
$var = False;

これらのどれも機能しません。エラーメッセージが表示されます

「strict subs」が使用されている間は、裸の「false」は許可されません。
4

9 に答える 9

298

Perl では、次の条件は false と評価されます。

0
'0'
undef
''  # Empty scalar
()  # Empty list
('')

残りは真実です。trueorには裸の言葉はありませんfalse

于 2009-06-24T04:10:16.550 に答える
74

私が遭遇した false の最も完全で簡潔な定義は次のとおりです。

空の文字列または文字列に文字列化されるものはすべて0false です。他のすべては真実です。

したがって、次の値は 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_numberfalseを返す任意の文字列。(例"abc")
于 2011-04-13T20:53:15.150 に答える
61

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 でよくある混乱の原因です。

于 2009-06-24T07:24:29.313 に答える
16

私のお気に入りはいつも

use constant FALSE => 1==0;
use constant TRUE => not FALSE;

これは内部表現から完全に独立しています。

于 2015-10-08T11:00:17.730 に答える
16

私はお勧めしuse boolean;ます。ただし、cpan からbooleanモジュールをインストールする必要があります。

于 2010-05-03T11:16:18.427 に答える
9

Perl でどの値が true と false であるかについて十分に説明されているチュートリアルに出くわしました。それは次のように述べています:

次のスカラー値は false と見なされます。

  • undef- 未定義の値
  • 0000 や 0.0 と書いても数字の 0
  • ''空の文字列。
  • '0'単一の 0 数字を含む文字列。

以下を含む他のすべてのスカラー値は true です。

  • 10 以外の数値
  • ' 'スペースを含む文字列
  • '00'文字列に 2 つ以上の 0 文字
  • "0\n"0 の後に改行
  • 'true'
  • 'false'はい、文字列 'false' でさえ true に評価されます。

Perl の true と falseについて説明する別の優れたチュートリアルがあります。

于 2015-04-13T12:56:37.700 に答える
-2

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_(
リテラル)

于 2021-09-12T03:37:27.627 に答える