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