0

それで。

Perl の DBI を使用して、Perl スクリプトから Oracle データベースにクエリを実行しています。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;

フィールドの 1 つが null になると、次のようになります。

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

データベースから null 値を期待していたので問題ありませんが、undef をテストしても、同じエラーが発生し、DBI のドキュメントがそうあるべきだと言っているとおりではないと思います。

fetchrow_arrayref の代替。データの次の行をフェッチし、フィールド名とフィールド値のペアを含むハッシュへの参照として返します。Null フィールドは、ハッシュの 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";
}

誰かがこれに当てる光を持っていますか?

前もって感謝します。

4

1 に答える 1

2

undef引数を定義解除する関数です。条件では、defined代わりに次を使用する必要があります。

next unless defined $hash{$key};
于 2013-04-15T23:00:00.157 に答える