Как использовать логические переменные в Perl?


Я пробовал:

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

ни один из них не работает. Я получаю сообщение об ошибке

Bareword "false" not allowed while "strict subs" is in use.
8 205

8 ответов:

в Perl следующие значения оцениваются как false в условных выражениях:

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

остальное-правда. Там нет пустых слов для true или false.

самое полное, краткое определение ложного, с которым я столкнулся, это:

все, что строится в пустую строку или строку `0`, является ложным. Все остальное-правда.

таким образом, следующие значения являются ложными:

  • пустая строка
  • числовое значение ноль
  • значение undefined
  • объект с перегруженным логическим оператором, который вычисляет один из вышеперечисленных.
  • A магическая переменная, которая оценивает один из вышеперечисленных на выборке.

имейте в виду, что пустой литерал списка оценивает неопределенное значение в скалярном контексте, поэтому он оценивает что-то ложное.


заметка о "истинных нулях"

в то время как числа, которые строятся в 0 являются ложными, строки, которые нумеруются до нуля, не обязательно. Единственными ложными строками являются 0 и пустая строка. Любая другая строка, даже если она нумерует до нуля, это правда.

ниже приведены строки, которые истинны как логическое значение и ноль как число.

  • без a предупреждающий:
    • "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";
}

одна вещь, которую я сделал в некоторых из моих программ, добавляется такое же поведение, используя константу:

#!/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", определяют константу с именем true, которая всегда равна 1, и константу с именем false, которая всегда оценивает к 0. Из-за того, что константы определяются в Perl, следующие строки кода также терпят неудачу:

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;. Вы должны установить boolean модуль из CPAN, хотя.

мои любимые всегда были

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

который полностью независим от внутреннего представления.

я наткнулся на учебник которые имеют хорошее объяснение о какие значения true и false в Perl. В нем говорится, что:

следующие скалярные значения считаются ложными:

  • undef - значение undefined
  • 0 число 0, даже если вы пишете его как 000 или 0.0
  • '' пустая строка.
  • '0' строка, содержащая один 0 цифра.

все остальные скалярные значения, в том числе в следующих случаях:

  • 1 любое не-0 число
  • ' ' строка с пробелом в ней
  • '00' две или более 0 символов в строке
  • "0\n" 0, за которым следует новая строка
  • 'true'
  • 'false' да, даже строка 'false' имеет значение true.

есть еще один хороший учебник, который объясните про Perl true and false.

красивое объяснение, данное bobf для булевых значений : правда или ложь? Краткое Справочное Руководство

тесты на истинность для разных значений

                       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, это действительно будет реально(!) 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 в качестве значений для ключей, но этот хак будет следить за правильными значениями вдоль вашего скрипта.