如何将数组或列表转换为hashref



我有一个这样的列表:

my $myV3VersionOfData = ["ZG","ZB","CXLDN",...];

我想把它转换成这样的字典:

my $entries = {
'ZG' => {
'value' => 'ZG'
},
'ZB' => {
'value' => 'ZB'
},
'CXLDN' => {
'value' => 'CXLDN'
},
...
};

到目前为止,我已经尝试过了,但它不起作用,并给了我一个错误:

不能使用字符串("ZG"(作为HASH引用;严格参考文献";在..使用

我知道这是因为我试图从列表中分配键值,但我如何将此列表转换为上面显示的词典?

my %genericHash;
for my $entry (@$myV3VersionOfData) {
$genericHash{ $entry->{key} } = $entry->{value};
}

我怎样才能做到这一点?我是Perl的新手,我尝试过很多东西,但似乎都不起作用。有人能帮忙吗?

你很接近。以下是从数组引用创建哈希引用的一种方法:

use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;
my $myV3VersionOfData = ["ZG","ZB","CXLDN"];
my $entries;
for (@{ $myV3VersionOfData }) {
$entries->{$_} = {value => $_};
}
print Dumper($entries);

输出:

$VAR1 = {
'CXLDN' => {
'value' => 'CXLDN'
},
'ZB' => {
'value' => 'ZB'
},
'ZG' => {
'value' => 'ZG'
}
};

如果你想遍历每个元素,计算一个新元素,那么你可以使用map函数。作为映射,可以返回多个值,每个条目返回两个值。这些可以转换为散列。

my $array   = ["ZG","ZB","CXLDN"];
my %hash    = map { $_ => { value => $_ } } @$array;
my $hashref = { map { $_ => { value => $_ } } @$array };

以下是我10多年来的做法。

#! /usr/bin/perl
use warnings;
use strict;
use Data::Dumper qw(Dumper);
my %entries;
my @myV3VersionOfData = ("ZG","ZB","CXLDN");
foreach (@myV3VersionOfData) {
$entries{$_}{'value'} = $_;
}
print Dumper %entries;

我们想要

'ZG' => { 'value' => 'ZG' }      # Copied literally from the Question

但是ZG部分是可变的,所以我们使用

$_ => { 'value' => $_ }

现在循环!

my %genericHash = map { $_ => { 'value' => $_ } } @$myV3VersionOfData;
my $entries = { map { $_ => { 'value' => $_ } } @$myV3VersionOfData };

不清楚你想要哪一个。

当然,它也可以使用foreach循环来完成。

my %genericHash;
for (@$myV3VersionOfData) {
$genericHash{$_} = { 'value' => $_ };
}

请研究以下代码片段是否符合您的问题。

use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my $myV3VersionOfData = ['ZG','ZB','CXLDN'];
my $hashref;
$hashref->{$_}{value} = $_ for @$myV3VersionOfData;
say Dumper($hashref);

输出

$VAR1 = {
'CXLDN' => {
'value' => 'CXLDN'
},
'ZB' => {
'value' => 'ZB'
},
'ZG' => {
'value' => 'ZG'
}
};

最新更新