我有一个这样的列表:
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'
}
};