如何在Perl中以惯用方式访问单个元素哈希的第一个元素?

Gen*_*neQ 4 perl hash

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

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

{ 1 => { id => 1 } }
Run Code Online (Sandbox Code Playgroud)

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

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

$results->{(keys %{$results})[0]}->{'id'};
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的方式来激活它?(不使用CPAN模块)

澄清

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

for*_*rk0 6

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

(values %$results)[0]->{id};
Run Code Online (Sandbox Code Playgroud)

通常情况下,由于返回的值的排序或者在使用相同的机器上的运行之间可能会有所不同,因此这个定义明确,但是由于您所说的只能包含一个或零个元素,因此这是一个有效的方法.keysvaluesperl%$results


ber*_*rdt 5

如果你只得到0/1行,为什么不做selectrow_arrayselectrow_hashref,而不是fetchall_hashref


Eug*_*ash 5

你为什么fetchall_hashref用来获取单个值?最好使用selectrow_array以下方法完成:

my ($max) = $dbh->selectrow_array($sql);
Run Code Online (Sandbox Code Playgroud)

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

my $val = [%$results]->[1]{id};
Run Code Online (Sandbox Code Playgroud)