如何将数组或列表转换为哈希引用?

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'
                  }
        };