2012-07-06 90 views
4

我有使用DBI的fetchall_hashref()获取一些数据的脚本。我如何在Perl中习惯性地访问单个元素哈希的第一个元素?

通常它会返回一个哈希值裁判这样的:

{ 1 => { id => 1 } } 

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

但目前使用的代码实现了实在是太丑:

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

有没有更优雅的方式来主动呢? (没有求助于CPAN模块)

澄清

我得到来自我们在家里使用数据访问层的哈希值。一切都通过fetchall_hashref()返回。我不会调用fetchall_hashref()本身,它只是如何在内部实现数据访问函数,所以我被告知。我是返回数据的消费者,它恰好是以散列形式出现的。我正在寻找一个更简洁的方法来访问单个返回值查询的结果

回答

6

你可以提领的第一个值的id关键在%$results

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

通常情况下,这不会是因为the ordering of values returned keys or values can be different even between runs on the same machine using the same perlwell defined,但是既然你说%$results只能包含一个或零个元素,这是一个有效的方法。

+0

可以扩展到获得第二个第一个值:'(values%{(values%$ results)[0]})[0]' – fork0 2012-07-06 09:46:33

+1

'(values%$ results)[0] - > { id};'是完美的。它清楚地表明你对整个'%$ results'没有兴趣,只有它的价值。无需尝试添加更多*值*。 – 2012-07-06 11:09:02

+1

@ fork0你使用'values'来完成这个任务,并拿到了第二名:D,但是在可读性方面,这是第一名。 – gaussblurinc 2012-07-06 12:25:25

5

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

+0

我从我们在室内使用的数据访问层得到这个。一切都通过fetchall_hashref()返回。我不会调用fetchall_hashref()本身,它只是如何在内部实现数据访问函数,所以我被告知。我是这种格式的返回数据的消费者。我正在寻找更简洁的方式来访问单个返回值查询的结果(如果存在)。 – GeneQ 2012-07-06 09:55:47

+1

啊 - 你能否更新这个问题,指出使用fetchall_hashref是你访问数据的唯一途径请 – beresfordt 2012-07-06 10:05:10

0
my @keys = sort { $a <=> $b } keys %$results; 
my $first = $keys[0]; 
$results->{$first}->{id}; 

或者如果$ first = 1;

$results->{1}->{id}; 
5

为什么使用fetchall_hashref来获取单个值?这是使用selectrow_array做得更好:

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

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

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

某种美 – gaussblurinc 2012-07-06 11:36:12

+0

有人可以解释第二个表达式吗?就像@loldop说的那样,美丽的东西,但是'[%$ results]'是什么? – fork0 2012-07-06 12:08:55

+0

我想我明白了:如果转换为列表,则散列由键和值对表示,其中只有值由列表中的索引获取。该操作产生的值,作为另一个散列的符号引用,可用于通过简单的{id}运算符(Perl魔术)访问散列值 – fork0 2012-07-06 12:18:10

1

您的数据访问层是否始终使用顺序键返回散列?如果是这样,那么怎么样

$results->{1}{id} 

(当然,也未必...但你的例子数据使用的密钥1的第一条记录,所以它可能是数据访问层可以使用确定性的钥匙。)

相关问题