Я намагався:
$var = false;
$var = FALSE;
$var = False;
Жоден з цих не працює. Я отримую повідомлення про помилку
Баревор "хибний" не дозволений, поки використовується "суворий абонемент".
Я намагався:
$var = false;
$var = FALSE;
$var = False;
Жоден з цих не працює. Я отримую повідомлення про помилку
Баревор "хибний" не дозволений, поки використовується "суворий абонемент".
Відповіді:
У Perl такі умови оцінюються як хибні в умовних умовах:
0
'0'
undef
'' # Empty scalar
() # Empty list
('')
Решта - правда. Немає баревок для true
або false
.
undef
.
('')
і ''
мають однакове значення. Я думаю, ви хотіли навести список із елементом, який складається з порожнього рядка (навіть якщо парени не створюють списки), але, як я вже згадував, неможливо перевірити, чи є список правдивим.
!0
ака PL_sv_yes
) і false ( !1
ака PL_sv_no
). Або ви кажете, що Perl повинен кричати, коли щось, крім цих двох значень, перевіряється на правдивість? Це було б абсолютно жахливо. Наприклад, це запобігло б$x ||= $default;
Найбільш повне, стисле визначення помилкового, яке я натрапив, це:
Все, що стрифіфікується на порожній рядок або рядок,
0
є помилковим. Все інше правда.
Тому такі значення помилкові:
Майте на увазі, що пустий літеральний список оцінюється до невизначеного значення у скалярному контексті, тому він оцінює щось неправдиве.
Примітка про "справжні нулі"
Хоча числа, які строковують 0
як помилкові, рядки, які нумізуються нулем, не обов'язково. Єдиними помилковими рядками є 0
і порожня рядок. Будь-який інший рядок, навіть якщо він дорівнює нулю, є істинним.
Нижче наведені рядки, які є істинними як булеві та нульові як число:
"0.0"
"0E0"
"00"
"+0"
"-0"
" 0"
"0\n"
".0"
"0."
"0 but true"
"\t00"
"\n0e1"
"+0.e-9"
Scalar::Util::looks_like_number
повертається хибним. (наприклад "abc"
)my $value = do { package XXX; use overload q[""] => sub { "XXX" }, q[bool] => sub { 0 }; bless [] };
. Тепер $value
буде переведено на "XXX", але збільшиться на false.
bool
файлом, позначається строком 0
. Крім того, вам не рекомендується створювати непослідовні перевантаження, і значення, які ви повертаєте, можна вважати такими. (Наприклад, &&
можуть бути оптимізовані в ||
, так що, якщо вони були суперечливими, ви повинні були б проблеми.)
0x00
охоплюється тут.
0x00
(числове значення нуль) або рядком 0x00
(для якого looks_like_number
помилковим)? Так чи інакше, це вже висвітлено.
У 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";
}
Рядки, позначені в "константа використання", визначають константу з ім'ям 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 warnings;
замість#! perl -w
if ($exitstatus) { exit; }
vs if ($exitstatus == true) { exit; }
, що може бути очевидним для випадкового спостерігача. (І так, останній приклад - поганий стиль програмування, але це поруч із сутью).
Рекомендую use boolean;
. Вам потрібно встановити boolean модуль із cpan, хоча.
if ($my_true_value == true)
. Прикидатися, що існує Єдина справжня правда, на мій досвід, це шлях до болю і неефективного коду.
Мої улюблені завжди були
use constant FALSE => 1==0;
use constant TRUE => not FALSE;
яка повністю незалежна від внутрішнього представництва.
Я натрапив на підручник, в якому є чітке пояснення про те, які значення є правдивими та хибними в Perl . У ньому зазначено, що:
Наступні скалярні значення вважаються помилковими:
undef
- невизначене значення0
число 0, навіть якщо ви записуєте його як 000 або 0,0''
порожній рядок.'0'
рядок, який містить одну цифру 0.Усі інші скалярні значення, включаючи наступне:
1
будь-яке не-0 число' '
рядок з пробілом у ньому'00'
два або більше 0 символів у рядку"0\n"
a 0, після чого новий рядок'true'
'false'
так, навіть рядок "false" оцінюється як true.Є ще один хороший підручник, який роз'яснює про Perl правдивим і хибним .
Прекрасне пояснення, яке дає 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, він буде фактично істинним (!) істинним та хибним (як і 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 як значення ключів, але цей хак забезпечить збереження правильних значень уздовж вашого сценарію.