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

StackOverflow https://stackoverflow.com/questions/1036347

  •  10-07-2019
  •  | 
  •  

質問

試しました:

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

これらの作業はありません。エラーメッセージが表示されます

Bareword "false" not allowed while "strict subs" is in use.
役に立ちましたか?

解決

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

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

残りは真実です。 true または false のベアワードはありません。

他のヒント

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

空の文字列または文字列「0」に文字列化するものはすべて偽です。それ以外はすべて真実です。

したがって、次の値はfalseです。

  • 空の文字列
  • 数値ゼロ
  • 未定義の値
  • 上記のいずれかを評価するブール演算子がオーバーロードされたオブジェクト。
  • フェッチ時に上記のいずれかに評価される魔法の変数。

空のリストリテラルはスカラーコンテキストで未定義の値に評価されるため、偽と評価されることに注意してください。


" true zeroes"に関するメモ

0 に文字列化する数字は偽ですが、ゼロに数字化する文字列は必ずしもそうではありません。唯一の偽の文字列は 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";
}

「定数を使用」でマークされた行常に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 boolean; をお勧めします。ただし、cpanから boolean モジュールをインストールする必要があります。

私のお気に入りはいつも

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

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

チュートリアルに出会いました。 Perl 。次のように述べています:

次のスカラー値はfalseとみなされます:

  • undef -未定義の値
  • 0 数値0(000または0.0として記述した場合でも)
  • '' 空の文字列。
  • '0' 単一の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を使用しますが、このハックにより、スクリプトに沿って正しい値が保持されるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top