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

Fut*_*eek 2 arrays perl hash

我在Perl中有以下数组,它们在数据库中作为多行获取.

$arrayref = [
    [ 1, "name1",  "name2" ],
    [ 2, "name3",  undef ],
    [ 3, "name5",  "name6" ],
    [ 4, "name10", undef ],
];
Run Code Online (Sandbox Code Playgroud)

我想把它变成像这样的哈希数组

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 },
);
Run Code Online (Sandbox Code Playgroud)

Сух*_*й27 8

您可以使用map {}将数组引用转换为哈希引用,

my @cols = qw(id name l_name);

my @array = map { my %h; @h{@cols} = @$_; \%h } @$arrayref;
Run Code Online (Sandbox Code Playgroud)

要么

use List::MoreUtils qw( zip );

my @cols = qw(id name l_name);

my @array = zip(\@cols, @$arrayref);
Run Code Online (Sandbox Code Playgroud)

  • 哦,那很优雅.我喜欢. (4认同)

Bor*_*din 8

我在Perl中有以下数组,它们在数据库中作为多行获取

你可能是在打电话

$sth->fetchall_arrayref();
Run Code Online (Sandbox Code Playgroud)

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

$sth->fetchall_arrayref( {} );
Run Code Online (Sandbox Code Playgroud)

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

DBI文档在此处对其进行描述

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

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

$tbl_ary_ref = $sth->fetchall_arrayref({});
Run Code Online (Sandbox Code Playgroud)