2013-04-15 3 views
0

SO.Perl DBI - Использование неинициализированного значения

Я запрашиваю базу данных Oracle из Perl-скрипта, используя Perl-интерфейс DBI. Я возвращаю возвращаемые строки, используя fetchrow_hashref (так как мне понадобится имя столбца позже). Я помещаю каждый из возвращенных строк в массив и возвращаю ссылку на этот массив. Поэтому в основном я возвращаю ссылку на массив ссылок на хеши. Что-то вроде этого:

my $sth = $dbh->prepare($query); 
$sth->execute(); 

# Fetch all rows returned as hash references and put each of those 
# references into the array @rows 
@returned_rows =(); 
while ($row = $sth->fetchrow_hashref()) { 
    push(@returned_rows, $row); 
} 

# Return a reference to the array @rows 
# Return a reference to an array of hash references 
return \@returned_rows; 

Если один из полей приходит как нуль, я получаю:

Use of uninitialized value in concatenation (.) or string at sqlesl.pl line 49. 

Что нормально, потому что я ожидал нулевых значений из базы данных, но даже если я проверить UNDEF , Я получаю ту же ошибку, которая заставляет меня думать, что все не так, как говорят DBI, должно быть:

Альтернатива fetchrow_arrayref. Выбирает следующую строку данных и возвращает ее как ссылку на хэш, содержащий имя поля и поле пары значений. Нулевые поля возвращаются как значения undef в хэше.

Это часть кода, которую я использовал для проверки фрагмента выше. Предположим, что * $ rows_ref * - это то, что возвращает вышеприведенный фрагмент.

@rows = @$rows_ref; 
$hash_ref = $rows[0]; 
%hash = %$hash_ref; 
@keys = keys %hash; 

foreach $key (@keys) { 
    next if (undef($hash{$key})); 
    print "$key: $hash{$key}\n"; 
} 

У кого-то есть некоторый свет для пролить на этот?

Заранее спасибо.

+1

Обратите внимание, что вы можете назвать '$ sth-> fetchall_arrayref ({})', чтобы получить ссылку на массив из hashref строк, так что вам не нужно заполнить '@returned_rows 'yourself – stevenl

ответ

2

undef - это функция, которая отменяет аргумент. В условиях, вы должны использовать вместо defined:

next unless defined $hash{$key}; 
+1

@horhay может также рассмотреть' существует $ hash {$ key} ' –

+0

Оба вас, спасибо большое! Оба решения - это то, что мне нужно. – romeroqj

Смежные вопросы