将数组数组转换为哈希数组

时间:2015-08-13 12:05:29

标签: arrays perl hash

我在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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:8)

  

我在Perl中有以下数组,这些数组在数据库

中作为多行获取

你可能正在打电话

$sth->fetchall_arrayref();

相反,如果您使用空的匿名哈希作为第一个参数

$sth->fetchall_arrayref( {} );

然后DBI将以您想要的格式返回数据作为哈希数组

DBI文档描述了它here

  

如果$slice是哈希引用,fetchall_arrayref将每行作为哈希引用获取。如果$slice哈希为空,则哈希中的键具有默认返回的任何名称。 (请参阅FetchHashKeyName属性。)如果$slice哈希值不为空,则将其用作切片以按名称选择单个列。哈希的值应设置为1.返回的哈希的键名与参数哈希中名称的字母大小写匹配,而不管FetchHashKeyName属性。

     

例如,要将每行的所有字段作为哈希ref:

获取
$tbl_ary_ref = $sth->fetchall_arrayref({});