您好我想拆分一行并将值添加到多维哈希中。这就是线条的样子:
__DATA__
49839382;Test1;bgsae;npvxs
49839384;Test2;bgsae;npvxs
49839387;Test3;bgsae;npvxs
所以我现在正在做的是:
my %prefix = map { chomp; split ';' } <DATA>;
但现在我只能使用:
访问Test1print $prefix{"49839382"}
但是我怎样才能将bgsae添加到Hash中,以便我可以使用
进行访问$prefix{"49839382"}{"Test1"}
感谢您的帮助。
答案 0 :(得分:3)
你想建立什么样的结构?
use Data::Dumper;
my %prefix = map { chomp (my @fields = split /;/); $fields[0] => { @fields[1 .. $#fields] } } <DATA>;
print Dumper \%prefix;
输出:
$VAR1 = {
'49839384' => {
'Test2' => 'bgsae',
'npvxs' => undef
},
'49839382' => {
'Test1' => 'bgsae',
'npvxs' => undef
},
'49839387' => {
'npvxs' => undef,
'Test3' => 'bgsae'
}
};
或者您需要更深层次的哈希?
my %prefix;
for (<DATA>) {
chomp;
my $ref = \%prefix;
for (split /;/) {
warn "[$_]";
$ref->{$_} = {};
$ref = $ref->{$_};
}
}
返回:
$VAR1 = {
'49839384' => {
'Test2' => {
'bgsae' => {
'npvxs' => {}
}
}
},
'49839382' => {
'Test1' => {
'bgsae' => {
'npvxs' => {}
}
}
},
'49839387' => {
'Test3' => {
'bgsae' => {
'npvxs' => {}
}
}
}
};
答案 1 :(得分:2)
我不知道你需要什么数据,但猜测你想要更像这样的东西。
它使用第一个字段作为数据的键,并使用数组中的其余三个值来构建数组的哈希值。因此,您可以将测试号码作为$data{'49839382'}[0]
等访问
use strict;
use warnings;
my %data = map {
chomp;
my @fields = split /;/;
shift @fields => \@fields;
} <DATA>;
use Data::Dumper;
print Data::Dumper->Dump([\%data], ['*data']);
__DATA__
49839382;Test1;bgsae;npvxs
49839384;Test2;bgsae;npvxs
49839387;Test3;bgsae;npvxs
<强>输出强>
%data = (
'49839384' => [
'Test2',
'bgsae',
'npvxs'
],
'49839382' => [
'Test1',
'bgsae',
'npvxs'
],
'49839387' => [
'Test3',
'bgsae',
'npvxs'
]
);