Как использовать логические переменные в Perl?
Я пробовал:
$var = false;
$var = FALSE;
$var = False;
ни один из них не работает. Я получаю сообщение об ошибке
Bareword "false" not allowed while "strict subs" is in use.
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
- значение undefined0
число 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 в качестве значений для ключей, но этот хак будет следить за правильными значениями вдоль вашего скрипта.