perl将数组元素放入哈希

Luk*_*uke 2 arrays perl hash

我有一个带有一堆字符串作为元素的数组,我想把它放入哈希.所以我先将数组中的字符串溢出,然后将解析后的字符串放入一个新的数组调用parse_list中.

这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper qw(Dumper);
my %hash;

my $string_array = [
                "Europe West France Spain Germany",
                "Europe North Finland Iceland",
                "Asia East Japan Korea China",
                "America North Mexico USA Canada"
    ];

foreach my $country(@{$string_array}){ 
    my @parse_list = split(/\s+/, $country);
    (my $continent,my $region,) = @parse_list[0,1];
    #I just know how to get the continent and region, I don't know how to put       
    #the element from index [2..4] to an array 

}
Run Code Online (Sandbox Code Playgroud)

我怎么设置

大陆作为主键,Region作为散列的第一层中的值.

Region作为辅助键,数组Country作为哈希第二层中的值.

所以它就像

my %hash = (
    Europe => {
        West => [ "France", "Spain", "Germany"]
        }
    );
Run Code Online (Sandbox Code Playgroud)

Dav*_*oss 5

当您"解析"列表时,将所有内容存储在单个数组中并不是很有帮助.相反,将数据放入更有用的变量中.

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my $string_array = [
  "Europe West France Spain Germany",
  "Europe North Finland Iceland",
  "Asia East Japan Korea China",
  "America North Mexico USA Canada"
];

my %geography;

for (@$string_array) {
  my ($continent, $region, @countries) = split;

  $geography{$continent}{$region} = \@countries;
}

print Dumper \%geography;
Run Code Online (Sandbox Code Playgroud)

输出是:

$VAR1 = {
          'America' => {
                         'North' => [
                                      'Mexico',
                                      'USA',
                                      'Canada'
                                    ]
                       },
          'Europe' => {
                        'West' => [
                                    'France',
                                    'Spain',
                                    'Germany'
                                  ],
                        'North' => [
                                     'Finland',
                                     'Iceland'
                                   ]
                      },
          'Asia' => {
                      'East' => [
                                  'Japan',
                                  'Korea',
                                  'China'
                                ]
                    }
        };
Run Code Online (Sandbox Code Playgroud)

更新(添加更多解释):

我已经改变了的名字%hash%geography-变量命名也很重要.

使用for (...)构造时,使用Perl的默认行为并将列表元素存储在其中通常很有用$_.这是因为$_它通常是各种操作的默认输入变量.在这种情况下,例如,我可以写:

for my $geo (@$string_array) {
  my ($continent, $region, @countries) = split /\s+/, $geo;
  ...
}
Run Code Online (Sandbox Code Playgroud)

但该split功能$_默认工作.而且,更好的是,它的标准行为是分开/\s+/,所以我们可以省略所有这些并最终得到更清晰的代码:

for (@$string_array) {
  my ($continent, $region, @countries) = split;
  ...
}
Run Code Online (Sandbox Code Playgroud)