如何将数组或列表转换为哈希引用?
How do I convert an array or a list into a hashref?
我有一个这样的列表:
my $myV3VersionOfData = ["ZG","ZB","CXLDN",...];
我想把它转换成这样的字典:
my $entries = {
'ZG' => {
'value' => 'ZG'
},
'ZB' => {
'value' => 'ZB'
},
'CXLDN' => {
'value' => 'CXLDN'
},
...
};
到目前为止我已经试过了,但它不起作用并给我一个错误:
Can't use string ("ZG") as a HASH ref while "strict refs" in use at..
我知道发生这种情况是因为我试图从列表中分配键值,但是如何将此列表转换为上面显示的字典?
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'
}
};
以下是我 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;
如果你想遍历每一个元素,计算出一个新的元素,那么你可以使用map
函数。作为地图,可以 return 多个值,你 return 每个条目两个值。这些可以转换为散列。
my $array = ["ZG","ZB","CXLDN"];
my %hash = map { $_ => { value => $_ } } @$array;
my $hashref = { map { $_ => { value => $_ } } @$array };
我们想要
'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'
}
};
我有一个这样的列表:
my $myV3VersionOfData = ["ZG","ZB","CXLDN",...];
我想把它转换成这样的字典:
my $entries = {
'ZG' => {
'value' => 'ZG'
},
'ZB' => {
'value' => 'ZB'
},
'CXLDN' => {
'value' => 'CXLDN'
},
...
};
到目前为止我已经试过了,但它不起作用并给我一个错误:
Can't use string ("ZG") as a HASH ref while "strict refs" in use at..
我知道发生这种情况是因为我试图从列表中分配键值,但是如何将此列表转换为上面显示的字典?
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'
}
};
以下是我 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;
如果你想遍历每一个元素,计算出一个新的元素,那么你可以使用map
函数。作为地图,可以 return 多个值,你 return 每个条目两个值。这些可以转换为散列。
my $array = ["ZG","ZB","CXLDN"];
my %hash = map { $_ => { value => $_ } } @$array;
my $hashref = { map { $_ => { value => $_ } } @$array };
我们想要
'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'
}
};