Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Это - нормальное поведение языка. Заключение в кавычки perlsyn
страница справочника:
номер
0
, строки'0'
и""
, пустой список()
, иundef
является всей ложью в булевом контексте. Все другие значения верны. Отрицание истинного значения!
илиnot
возвраты специальное ложное значение. Когда оценено как строка это рассматривают как""
, но как число, это рассматривают как0
.
из-за этого, должен быть способ возвратиться 0
из системного вызова, который ожидает возвращаться 0
как (успешное) возвращаемое значение и оставлять способ сигнализировать о случае возникновения отказов путем фактического возврата ложного значения. "0 but true"
служит той цели.
"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";
}
Когда Вы хотите записать функцию, которая возвращает или целочисленное значение, или ложь или undef (т.е. для ошибочного случая) тогда необходимо не упустить нуль значения. Возврат его является ложью и не должен указывать, что состояние ошибки, таким образом возвращаясь "0, но верный" делает функциональное возвращаемое значение верным, все еще пасование назад значения обнуляет, когда математика сделана на нем.
Я просто нашел доказательство, что строка "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
Другой пример "0, но верный":
модуль DBI использует "0E0" в качестве возвращаемого значения для Запросов на обновление или Запросов на удаление, которые не влияли ни на какие записи. Это оценивает к истинному в булевом контексте (указание, что запрос выполнялся правильно), и к 0 в числовом контексте, указывающем, что никакие записи не были изменены запросом.
0 ложь средств в Perl (и другие языки, связанные с C). По большей части это - разумное поведение. Другие языки (Lua, например) обработка 0 как верные и обеспечивают другой маркер (часто ноль или ложь ) для представления неистинного значения.
Один случай, где Perl путь не работает так хорошо, - когда Вы хотите возвратить или число или, если функция перестала работать по некоторым причинам, ложное значение. Например, если Вы пишете функцию, которая читает строку из файла и возвращает количество символов на строке. Общее использование функции могло бы быть чем-то как:
while($c = characters_in_line($file)){
...
};
Уведомление, что, если количество символов на конкретной строке 0, , в то время как цикл закончится перед концом файла. Так функция characters_in_line должна особый случай 0 символов и возврат '0, но верный' вместо этого. Тем путем функция будет работать, как предназначено в , в то время как цикл, но также и дают корректный ответ, должен он использоваться в качестве числа.
Примечание, что это не созданный в части языка. Скорее это использует в своих интересах способность Perl интерпретировать строку как число. Таким образом, другие жала иногда используются вместо этого. использование DBI "0E0", например. Когда оценено в числовом контексте, они возвращаются 0 , но в булевом контексте, ложь .
Можно также видеть строку "0E0", используемый в коде Perl , и это означает то же самое, где 0E0 просто означает 0 записанных в экспоненциальном представлении. Однако, так как Perl только рассматривает "0", '' или undef как ложь, он оценивает к истинному в булевом контексте.
Дополнительно к то, что другие сказали, "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
В целочисленном контексте это оценивает к 0 (числовая часть в начале строки) и является нулем. В скалярном контексте это - непустое значение, таким образом, это верно.
if (int("0 but true")) { print "zero"; }
(никакой вывод)
if ("0 but true") { print "true"; }
(печатает верный)