如何在Perl中习惯性地访问单个元素散列的第一个元素?

如何在Perl中习惯性地访问单个元素散列的第一个元素?,perl,hash,Perl,Hash,我有一个脚本,它使用DBI的fetchall\u hashref()获取一些数据 通常它会返回如下所示的散列引用: { 1 => { id => 1 } } 但是,我只对散列中第一项的值感兴趣,它是特定列的最大值。我知道Perl哈希不是有序的,但幸运的是,这个特定的查询总是精确地返回1或0条记录(因为这是一个MAX()查询) 但目前用于实现这一目标的代码非常难看: $results->{(keys %{$results})[0]}->{'id'}; 有没有更优雅的方式

我有一个脚本,它使用DBI的fetchall\u hashref()获取一些数据

通常它会返回如下所示的散列引用:

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

但目前用于实现这一目标的代码非常难看:

$results->{(keys %{$results})[0]}->{'id'};
有没有更优雅的方式来激活这个?(无需借助CPAN模块)

澄清


我从我们内部使用的数据访问层获取哈希值。所有内容都通过fetchall\u hashref()返回。我不调用fetchall_hashref()本身,而是告诉我,数据访问函数是如何在内部实现的。我是返回数据的消费者,它恰好是散列形式的。我正在寻找一种更简洁的方法,如果存在的话,可以访问单返回值查询的结果,而不是fetchall\u hashref如果只返回0/1行,为什么不执行or?

为什么要使用
fetchall\u hashref
来获取单个值?这最好通过以下方式完成:

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

my $val = [%$results]->[1]{id};

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

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

通常情况下,这不会是因为,但因为您说过,
%$results
只能包含一个或零个元素,所以这是一种有效的方法。

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

$results->{1}{id}

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

也可以扩展以获得第二个第一个值:
(值%{(值%$results)[0]})[0]
(值%$results)[0]->{id}是完美的。它清楚地表明,您对整个
%$results
不感兴趣,只对其值感兴趣。无需尝试为其添加更多值。@fork0您使用
values
来完成此任务,并获得了第二名:D,但在可读性方面这是第一名。我尝试了(values%$results)[0]{id};似乎有效。删掉两个字符。我是从我们在家里使用的数据访问层得到的。所有内容都通过fetchall\u hashref()返回。我不调用fetchall_hashref()本身,而是告诉我,数据访问函数是如何在内部实现的。我是恰好以这种格式返回的数据的消费者。我正在寻找一种更简洁的方法,如果存在的话,来访问单返回值查询的结果。啊-你能更新这个问题,说明使用fetchall\u hashref是访问数据的唯一方法吗?请有人解释一下第二个表达式,好吗?正如@loldop所说,这是一件美丽的事情,但究竟是什么呢?
[%$results]
?我想我明白了:如果将哈希转换为列表,它由键和值对表示,其中只有值由列表中的索引获取。该操作生成的值是另一个哈希的符号引用,可以通过简单的{id}运算符(Perl magic)访问哈希值,因此,虽然我的解决方案可能是“完美的”(@sinan unur),我个人会满怀激情地记住这一条:)@fork0:它引用了一个数组,其中包含
%$results
的键/值对From:作为其他列表的一部分包含的哈希(…)总是平铺成键/值对。非常聪明,@eugeney。向你致敬。然而,它几乎和原始代码一样晦涩难懂。尽管如此,这是一个很好的例子
my $val = [%$results]->[1]{id};
(values %$results)[0]->{id};
$results->{1}{id}