Что делает “0, но верный” средний в Perl?

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

61
задан Bill the Lizard 9 August 2011 в 20:18
поделиться

9 ответов

Это - нормальное поведение языка. Заключение в кавычки perlsyn страница справочника:

номер 0, строки '0' и "", пустой список (), и undef является всей ложью в булевом контексте. Все другие значения верны. Отрицание истинного значения ! или not возвраты специальное ложное значение. Когда оценено как строка это рассматривают как "", но как число, это рассматривают как 0.

из-за этого, должен быть способ возвратиться 0 из системного вызова, который ожидает возвращаться 0 как (успешное) возвращаемое значение и оставлять способ сигнализировать о случае возникновения отказов путем фактического возврата ложного значения. "0 but true" служит той цели.

57
ответ дан Kevin Panko 24 November 2019 в 16:55
поделиться

"0, но верный" строка точно так же, как любой другой, но из-за синтаксиса perl она может служить полезной цели, а именно, возвращая целочисленный нуль из функции без результата, являющегося "ложью" (в глазах perl).

И строка не должен быть "0, но верен". "0, но ложь" все еще "верно" в булевом смысле.

рассмотрите:

if(x)

for x:        yields:
1             -> true
0             -> false
-1            -> true
"true"        -> true
"false"       -> true
"0 but true"  -> true
int("0 but true") ->false

результат всего этого - Вы, может иметь:

sub find_x()

и имеют этот код быть в состоянии распечатать "0" как его вывод:

if($x = find_x)
{
   print int($x) . "\n";
}
3
ответ дан Frosty 24 November 2019 в 16:55
поделиться

Когда Вы хотите записать функцию, которая возвращает или целочисленное значение, или ложь или undef (т.е. для ошибочного случая) тогда необходимо не упустить нуль значения. Возврат его является ложью и не должен указывать, что состояние ошибки, таким образом возвращаясь "0, но верный" делает функциональное возвращаемое значение верным, все еще пасование назад значения обнуляет, когда математика сделана на нем.

3
ответ дан andy 24 November 2019 в 16:55
поделиться

Я просто нашел доказательство, что строка "0, но верный" actially встроена в интерпретатор, как некоторые люди здесь уже ответил:

$ strings /usr/lib/perl5/5.10.0/linux/CORE/libperl.so | grep -i true
Perl_sv_true
%-p did not return a true value
0 but true
0 but true
4
ответ дан jkramer 24 November 2019 в 16:55
поделиться

Другой пример "0, но верный":

модуль DBI использует "0E0" в качестве возвращаемого значения для Запросов на обновление или Запросов на удаление, которые не влияли ни на какие записи. Это оценивает к истинному в булевом контексте (указание, что запрос выполнялся правильно), и к 0 в числовом контексте, указывающем, что никакие записи не были изменены запросом.

4
ответ дан kixx 24 November 2019 в 16:55
поделиться

0 ложь средств в Perl (и другие языки, связанные с C). По большей части это - разумное поведение. Другие языки (Lua, например) обработка 0 как верные и обеспечивают другой маркер (часто ноль или ложь ) для представления неистинного значения.

Один случай, где Perl путь не работает так хорошо, - когда Вы хотите возвратить или число или, если функция перестала работать по некоторым причинам, ложное значение. Например, если Вы пишете функцию, которая читает строку из файла и возвращает количество символов на строке. Общее использование функции могло бы быть чем-то как:

while($c = characters_in_line($file)){
    ...
};

Уведомление, что, если количество символов на конкретной строке 0, , в то время как цикл закончится перед концом файла. Так функция characters_in_line должна особый случай 0 символов и возврат '0, но верный' вместо этого. Тем путем функция будет работать, как предназначено в , в то время как цикл, но также и дают корректный ответ, должен он использоваться в качестве числа.

Примечание, что это не созданный в части языка. Скорее это использует в своих интересах способность Perl интерпретировать строку как число. Таким образом, другие жала иногда используются вместо этого. использование DBI "0E0", например. Когда оценено в числовом контексте, они возвращаются 0 , но в булевом контексте, ложь .

9
ответ дан Jon Ericson 24 November 2019 в 16:55
поделиться

Можно также видеть строку "0E0", используемый в коде Perl , и это означает то же самое, где 0E0 просто означает 0 записанных в экспоненциальном представлении. Однако, так как Perl только рассматривает "0", '' или undef как ложь, он оценивает к истинному в булевом контексте.

24
ответ дан Andy Lester 24 November 2019 в 16:55
поделиться

Дополнительно к то, что другие сказали, "0 but true", специально в корпусе в этом, это не предупреждает в числовом контексте:

$ perl -wle 'print "0 but true" + 3'
3
$ perl -wle 'print "0 but crazy" + 3'
Argument "0 but crazy" isn't numeric in addition (+) at -e line 1.
3
45
ответ дан moritz 24 November 2019 в 16:55
поделиться

В целочисленном контексте это оценивает к 0 (числовая часть в начале строки) и является нулем. В скалярном контексте это - непустое значение, таким образом, это верно.

  • if (int("0 but true")) { print "zero"; }

    (никакой вывод)

  • if ("0 but true") { print "true"; }

    (печатает верный)

10
ответ дан user2291758 24 November 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: