2012-07-06 67 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的第一條記錄,所以它可能是數據訪問層可以使用確定性的鑰匙。)

相關問題