Perl将行添加到多维哈希中

时间:2013-02-12 12:55:02

标签: perl hashmap

您好我想拆分一行并将值添加到多维哈希中。这就是线条的样子:

__DATA__
49839382;Test1;bgsae;npvxs
49839384;Test2;bgsae;npvxs
49839387;Test3;bgsae;npvxs

所以我现在正在做的是:

my %prefix = map { chomp; split ';' } <DATA>;

但现在我只能使用:

访问Test1
print $prefix{"49839382"}

但是我怎样才能将bgsae添加到Hash中,以便我可以使用

进行访问
$prefix{"49839382"}{"Test1"}

感谢您的帮助。

2 个答案:

答案 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'
                    ]
    );