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;

如果其中一个字段为空,我得到:

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";
}

有人对此有一些启示吗?

提前致谢。

4

1 回答 1

2

undef是取消定义其参数的函数。在条件下,您应该defined改用:

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