web-dev-qa-db-ja.com

Perlでブール変数を使うにはどうすればいいですか?

私が試してみました:

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

これらのどれも動作しません。エラーメッセージが出ます

"strict subs"が使用されている間は、 "false"は使用できません。
210
Chad DeShon

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

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

残りは本当です。 trueまたはfalseに必要な語はありません。

276

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

空の文字列または文字列 `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"
69
ikegami

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における非常に一般的な混乱の原因です。

57
James Thompson

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

16
xenoterracide

私のお気に入りはいつもされています

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

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

10
syck

私は チュートリアル に出会いました。これはPerlについてどのような値が正しいか間違っているかについて説明しています。それは述べています:

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

  • undef - 未定義の値
  • 0は、たとえあなたが000または0.0と書いたとしても、0です。
  • ''は空の文字列です。
  • '0'は、単一の0桁を含むストリングです。

次のものを含め、他のすべてのスカラー値は当てはまります。

  • 1 0以外の数値
  • ' 'スペースを含む文字列
  • '00'文字列中に0文字以上
  • "0\n" a 0とそれに続く改行
  • 'true'
  • 'false'はい、文字列 'false'でもtrueと評価されます。

Perlの真と偽 について説明している別の良いチュートリアルがあります。

7
serenesat

ブール値についての 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
5
Bharat

次のファイル接頭辞を使用してください、これはあなたの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を得たからです。しかし、このハックは正しい値があなたのスクリプトに沿って保たれることを確実にするでしょう。

0
user257319