1

配列があります。配列内の要素には、それらの間にセミコロンが含まれています。

配列は次のようになります。

@Array = { "AUT;E;1",
           "AUT;E;2",
           "CHE;A;1",
           "CHE;C;4"
         };

';'を使用して配列要素を分割したい (セミコロン)区切り文字として。

ハッシュのハッシュを使用して、「AUT」をキーとして保存し、その下にE=>1およびE=>2を保存します。

つまり、ハッシュが必要でした

%HashOfElem = (
         'AUT' => {
                     'E' => 1,
                     'E' => 2
                  },

         'CHE' => {
                     'A' => 1,
                     'C' => 4
                  }
              )

その目的のために、私は期待どおりに動作しない次のコードを書きました:(

foreach(@Array)
{
    my @TmpArray = split(/;/,$_);

    %HashOfElem = (
              $TmpArray[0] => {
                                  $TmpArray[1] => $TmpArray[2]
                              }
                  );

}

私のアプローチが間違っている場合、perlのどのデータ構造を使用して上記の目的を達成できますか?

助けてください..

4

2 に答える 2

7

@Arrayに間違った割り当てを行っていることに注意してください。これは、次のようにする必要があります(中括弧ではなく括弧)。

コメントに従って更新:

my @array = (
    "AUT;E;1",
    "AUT;E;2",
    "CHE;A;1",
    "CHE;C;4"
);

したがって、スクリプトは次のようになります。

my @array = (
    "AUT;E;1",
    "AUT;E;2",
    "AUT;E;2",
    "CHE;A;1",
    "CHE;C;4"
);
my %hash;
my %dups;
foreach (@array) {
    next if exists $dups{$_};  # skip this line if already stored
    $dups{$_} = 1;
    my @tmp = split/;/;
    push @{$hash{$tmp[0]}{$tmp[1]}}, $tmp[2];
}
say Dumper\%hash;

出力:

$VAR1 = {
          'CHE' => {
                     'A' => [
                              '1'
                            ],
                     'C' => [
                              '4'
                            ]
                   },
          'AUT' => {
                     'E' => [
                              '1',
                              '2'
                            ]
                   }
        };
于 2012-10-24T11:40:28.207 に答える
2

前述のように、ハッシュキーは一意である必要があります。これを回避する1つの方法は、各内部ハッシュキーがそのキーの値の配列を指すようにすることです。

use strict;
use warnings;

my @Array = ( 
    "AUT;E;1",
    "AUT;E;2",
    "CHE;A;1",
    "CHE;C;4"
);
my %HashOfElem;

foreach(@Array)
{
    my @TmpArray = split(';',$_);
    print "@TmpArray\n";

    push @{$HashOfElem{$TmpArray[0]}{$TmpArray[1]}}, $TmpArray[2];
}

#show variable.
use Data::Dumper;
print Dumper %HashOfElem;
于 2012-10-24T11:44:54.443 に答える