我有一个带有一堆字符串作为元素的数组,我想把它放入哈希.所以我先将数组中的字符串溢出,然后将解析后的字符串放入一个新的数组调用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)
当您"解析"列表时,将所有内容存储在单个数组中并不是很有帮助.相反,将数据放入更有用的变量中.
#!/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)