2015-08-13 74 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