1

こんにちは私は行を分割し、値を多次元ハッシュに追加したいと思います。Linesは次のようになります。

__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

何のためにデータが必要かわかりませんが、おそらくもっとこのようなものが必要です。

最初のフィールドをデータのキーとして使用し、残りの3つを値の配列として使用して、配列のハッシュを作成します。$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 に答える