4

我有使用 DBI 的 fetchall_hashref() 获取一些数据的脚本。

通常它会返回一个哈希引用,如下所示:

{ 1 => { id => 1 } }

但是,我只对哈希中第一项的值感兴趣,它是特定列的最大值。我知道 Perl 哈希没有排序,但幸运的是,这个特定的查询总是准确地返回 1 或 0 条记录(因为这是一个 MAX() 查询)。

但是目前用来实现这一点的代码真的很难看:

$results->{(keys %{$results})[0]}->{'id'};

有没有更优雅的方式来激活它?(不借助 CPAN 模块)

澄清

我从我们内部使用的数据访问层获取哈希值。一切都通过 fetchall_hashref() 返回。我不调用 fetchall_hashref() 本身,它只是内部实现数据访问函数的方式,所以有人告诉我。我是该返回数据的消费者,它恰好是散列的形式。我正在寻找一种更简洁的方法(如果存在)来访问单个返回值查询的结果

4

5 回答 5

6

您可以取消引用id第一个值的键%$results

(values %$results)[0]->{id};

通常,这不会被很好地定义,因为返回的值的顺序keys或者values即使在使用相同的同一台机器上运行之间也可能不同perl,但是由于您说%$results只能包含一个或零个元素,这是一种有效的方法。

于 2012-07-06T09:43:58.507 回答
5

你为什么fetchall_hashref要获取单个值?最好使用selectrow_array

my ($max) = $dbh->selectrow_array($sql);

更新:如果您不能使用其他 DBI 方法,更简洁的方法是:

my $val = [%$results]->[1]{id};
于 2012-07-06T09:29:56.030 回答
5

如果您只返回 0/1 行而不是 fetchall_hashref ,为什么不执行selectrow_arrayselectrow_hashref

于 2012-07-06T09:28:38.177 回答
1

您的数据访问层是否总是返回带有顺序键的散列?如果是这样,那怎么办

$results->{1}{id}

(当然,它可能不会......但是您的示例数据使用1了第一条记录的键,因此数据访问层可能使用确定性键。)

于 2012-07-06T10:32:04.153 回答
0
my @keys = sort { $a <=> $b } keys %$results;
my $first = $keys[0];
$results->{$first}->{id};

或者如果 $first = 1;

$results->{1}->{id};
于 2012-07-06T09:29:04.173 回答