Perl:多维哈希的解引用数组

时间:2017-09-15 23:59:45

标签: arrays perl multidimensional-array hash dereference

我的整体结构有三层:

第一层是哈希::大陆:国家/地区

第二层是哈希::国家:具有特定国家/地区的二维数组

第三层是 2D阵列

到目前为止,我的代码如下:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper qw(Dumper);

my %hash=(); #initialize a hash 
my $hash_ref = \%hash;

$hash{continent} = { 
    America => [
    ['North', 'Canada', 'USA'],
    ['South', 'Peru', 'Brazil'],
    ],
    Asia => [
    ['East', 'Japan', 'China'],
    ['Sounth', 'India','Bangladesh'],
    ],
}; 

foreach my $continent (keys %hash) {
    foreach my $country (keys %{ $hash{$continent} }) {
        print "$continent, $country : @{$hash{$continent}{$country}}\n";
    }
}

#print Dumper \%hash;

这是输出:

大陆,亚洲:ARRAY(0x7fb159824890)ARRAY(0x7fb15a004628)

大陆,美国:ARRAY(0x7fb159803ee8)ARRAY(0x7fb1598240e0)

我的问题是: 如何在散列的散列中使用2D数组,而不是获取它们的引用??

2 个答案:

答案 0 :(得分:1)

如果您有选择,则应将数据结构的设计更改为@bipll suggested。您现有的数据结构设计需要比所需更复杂的代码。如果你不能,请继续阅读。

第一个循环不正确。

这不会遍历大陆名称:

foreach my $continent (keys %hash) {

这样做:

foreach my $continent (keys %{ $hash{continent} }) {

第二个循环不正确。

$hash{$continent}现在$hash{continent}{$continent}是对数组的引用,而不是对哈希的引用。

修正:

my $by_continent = $hash{continent};
for my $continent_name (keys(%$by_continent)) {
    my $continent = $by_continent->{$continent_name};
    for my $region (@$continent) {
        my $region_name = $region->[0];
        my @country_names = @{$region}[0..$#$region];
        print("$continent_name, $region_name: ", join(', ', @country_names), "\n");
    }
}

答案 1 :(得分:0)

首先,keys %hash是代码中的单例列表('continent')。我想你真的想要大陆名称作为关键吗?然后简单地将其写为

my %hash = (America => [...], Asia => [...]);

接下来,' North'和南方'看起来更像是大陆内的地区,你可能错过了设计描述中的一层。

这表明类似:

my %hash = (America => {North => ['Canada', 'USA'], South => ['Peru', 'Brazil']});
for my $continent (keys %hash) {
    for my $region (keys %{$hash{$continent}}) {
        print "$continent, $region, @{$hash{$continent}{$region}}\n"
    }
}

输出:

America, North, Canada USA
America, South, Peru Brazil