2015-08-13 106 views
2

我在Perl中擁有以下數組中的數組,它們在數據庫中獲得多行。將陣列數組轉換爲散列陣列

$arrayref = [ 
    [ 1, "name1", "name2" ], 
    [ 2, "name3", undef ], 
    [ 3, "name5", "name6" ], 
    [ 4, "name10", undef ], 
]; 

我想使這個作爲哈希這樣

my @array = (
    { id => 1, name => "name1", l_name => "name2" }, 
    { id => 2, name => "name3", l_name => undef }, 
    { id => 3, name => "name5", l_name => "name6" }, 
    { id => 4, name => "name10", l_name => undef }, 
); 
+2

你從哪裏獲得您的數據與您的陣列?將它解析爲上游哈希(而不是稍後轉換)一個選項? – Sobrique

回答

8

您可以使用map {}變換數組引用哈希引用數組,

my @cols = qw(id name l_name); 

my @array = map { my %h; @h{@cols} = @$_; \%h } @$arrayref; 

use List::MoreUtils qw(zip); 

my @cols = qw(id name l_name); 

my @array = zip(\@cols, @$arrayref); 
+4

哦,這非常優雅。我喜歡。 – Sobrique

+0

是的。感謝您的解決方案。我做的是一個冗長的代碼 – Futuregeek

+1

雖然這解決了OP的直接問題,[@ Borodin的答案](http://stackoverflow.com/a/31988118/100754)解決了真正的問題。 –

8

我有以下在Perl數組,其在數據庫中獲得儘可能多行的陣列

您大概調用

$sth->fetchall_arrayref(); 

相反,如果你使用一個空的匿名哈希作爲第一個參數

$sth->fetchall_arrayref({}); 

然後DBI將以您想要的格式返回數據作爲散列數組

的DBI文檔描述它here

如果$slice是散列參考,fetchall_arrayref取各行作爲散列參考。如果$slice散列值爲空,則默認情況下,散列中的鍵具有任何名稱lettercase。 (請參閱FetchHashKeyName屬性。)如果$slice散列不爲空,則將其用作切片以按名稱選擇各個列。散列值應設置爲1.返回散列的鍵名稱與參數散列中名稱的字母大小相匹配,而不管FetchHashKeyName屬性如何。

例如,獲取每一行的所有字段作爲哈希REF:

$tbl_ary_ref = $sth->fetchall_arrayref({}); 
+0

你可以添加一個到DBI文檔的鏈接嗎?我從來沒有見過這個功能。 – simbabque

+0

@simbabque:好的,但它只是'fetchall_arrayref'文檔 – Borodin