1

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

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

所以我现在要做的是:

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

但现在我只能通过以下方式访问 Test1:

print $prefix{"49839382"}

但是我怎样才能将 bgsae 添加到哈希中以便我可以访问

$prefix{"49839382"}{"Test1"}

感谢您的帮助。

4

2 回答 2

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' => {}
                                              }
                                 }
                    }
    };
于 2013-02-12T13:18:10.927 回答
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'
                    ]
    );
于 2013-02-12T13:58:38.573 回答