Значение 0 but true
является частным случаем в Perl. Хотя для ваших простых смертных глаз это не похоже на число, мудрый и всем знающий Perl понимает, что это действительно число.
Это связано с тем, что когда подпрограмма Perl возвращает значение 0, предполагается, что подпрограмма завершилась неудачно или вернула ложное значение.
Представьте, что у меня есть подпрограмма, которая возвращает сумму двух чисел:
die "You can only add two numbers\n" if (not add(3, -2));
die "You can only add two numbers\n" if (not add("cow", "dog"));
die "You can only add two numbers\n" if (not add(3, -3));
Первое утверждение не умрет, потому что подпрограмма вернет 1
. Это хорошо.
Второе утверждение умрет, потому что подпрограмма не сможет добавить корова к собака .
А третье утверждение?
Хммм, я могу добавить 3
к -3
. Я просто получаю 0
, но моя программа умрет, даже если подпрограмма add
сработает!
Чтобы обойти это, Perl считает 0 but true
числом. Если моя подпрограмма add возвращает не просто 0 , но 0, но true , мое третье утверждение будет работать.
Но является ли 0, но истинным числовым нулем? Попробуйте это:
my $value = "0 but true";
print qq(Add 1,000,000 to it: ) . (1_000_000 + $value) . "\n";
print "Multiply it by 1,000,000: " . 1_000_000 * $value . "\n";
Да, это ноль!
Подпрограмма index - это очень старая часть Perl, существовавшая до концепции 0, но истинная была рядом. Предполагается вернуть позицию подстроки, расположенной в строке:
index("barfoo", "foo"); #This returns 3
index("barfoo", "bar"); #This returns 0
index("barfoo", "fu"); #This returns ...uh...
Последняя запись возвращает -1
. Что означает, что если бы я сделал это:
if ($position = index($string, $substring)) {
print "It worked!\n";
}
else {
print "If failed!\n";
}
Как я обычно делаю со стандартными функциями, это не сработает. Если бы я использовал «barfoo» и «bar», как я делал во втором операторе, было бы выполнено предложение else
, но если бы я использовал «barfoo» и «fu», как в третьем, было бы выполнено предложение if
. Не то, что я хочу.
Однако, если подпрограмма index
вернула 0, но true для второго оператора и undef
для третьего оператора, мое предложение if
/ else
сработало бы.