Как я могу напечатать литерал 'null' для неопределенных значений в Perl? - PullRequest
3 голосов
/ 23 февраля 2009

Я выполняю запрос «описать таблицу», и он возвращает значение «ноль» для столбца «по умолчанию». Однако, когда я пытаюсь напечатать значение из базы данных в таблицу HTML, он не печатает «ноль». Просто всегда пусто.

Вот как я храню данные из базы данных:

@nulls = ();

while (($null) = $sth1->fetchrow_array)
    {
    push (@nulls, $null);
    }

Когда я печатаю содержимое массива @nulls, он никогда не печатает буквальное значение 'null'. Это всегда пусто. Есть ли способ преодолеть эту проблему?

Ответы [ 4 ]

13 голосов
/ 23 февраля 2009

Как сказал Крис Дж, нулевые значения возвращаются как неопределенные значения.

Если бы у вас были включены предупреждения, вы бы получили предупреждение «неопределенное значение при печати» при печати значений. Использование прагматических strict и warnings может сэкономить много времени на отладку. Прагма diagnostics добавляет дополнительный пояснительный текст к стандартным предупреждениям и фатальным ошибкам.

Довольно просто отследить и заменить значения NULL, когда они поступают из базы данных:

use strict;
use warnings;

my @nulls = ();
while ((my $null) = $sth1->fetchrow_array)
    {
            # before perl 5.10: use the ternary operator.
            push @nulls, defined $null ? $null : 'NULL';

            # perl 5.10 adds the defined-or operator: //
            push @nulls, $null // 'NULL';
    }

Или вы можете построить свой массив @nulls так же, как показано выше, а затем изменить нули во время отображения.

my @pre_5_10  = map { defined $_ ? $_ : 'NULL' } @nulls;
my @perl_5_10 = map { $_ // 'NULL' } @nulls;
7 голосов
/ 23 февраля 2009

Начиная с http://metacpan.org/pod/DBI, он возвращает нулевые значения как undef.

2 голосов
/ 23 февраля 2009

Я не использую Perl, но на любом другом языке, который я использовал, вы должны проверить значение на ноль. Если это ноль, распечатайте строковый литерал "нуль".

1 голос
/ 24 февраля 2009

Вы не говорите, какую базу данных используете, но вы можете сделать это на уровне SQL, если не возражаете против непереносимого решения, например, в Oracle:

select NVL(some_column, 'NULL')
from some_table
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...