0

これを例で説明しようと思います。ハッシュのハッシュの一般的な例を見てみましょう。

my %HoH = (
    flintstones => {
        lead => "fred",
        pal  => "barney",
    },
    jetsons => {
        lead      => "george",
        wife      => "jane",
        "his boy" => "elroy",
    },
    simpsons => {
        lead => "homer",
        wife => "marge",
        kid  => "bart",
    },
);

私の目的のために、名前のない、または匿名のハッシュを%HOHに追加できるようにしたいと思います。実行時まで、これらのサブハッシュを定義する必要はありません(または定義できません)。Perlでこれをどのように達成できますか?

私が読んだもの(そしてPerldocsとGoogleですでに読んだもの)はすべて、すべてのサブハッシュ(たとえば、「フリントストーン」、「ジェットソン」、「シンプソンズ」)が定義されている例を示しているようです。

私がやっていることは、CSVファイルからの行を含むサブハッシュを含む親ハッシュを構築しようとしています。

%TopHash = (
   %Line1 => {
      cell01 => $some_value1a;
      cell02 => $some_value2a;
      cell03 => $some_value3a;
   },
   %Line2 => {
      cell01 => $some_value1b;
      cell02 => $some_value2b;
      cell03 => $some_value3b;
   },
   %Line3 => {
      cell01 => $some_value1c;
      cell02 => $some_value2c;
      cell03 => $some_value3c;
   },
# etc
# etc
# etc

    );

必要な「%LineX」ハッシュの数は、実行時までわかりません(実行時に読み取られるCSVの行数を表すため)。

何か案は?まだはっきりしていない場合は...私はまだPerlハッシュに頭を包み込もうとしています。

4

4 に答える 4

3

実行時に匿名ハッシュを追加するには、通常のハッシュ要素と同じように割り当てます。

$HoH{key} = { foo => 42 };

また

$HoH{key} = $hash_ref;

また

$HoH{key} = \%hash;
于 2009-10-29T16:58:26.013 に答える
1

まず、解析している現在の行からハッシュを作成します

my %lineHash = (
    cell01 => $some_value1a,
    cell02 => $some_value1b,
    cell03 => $some_value1c
);

またはハッシュへの参照を完全に作成します

my $lineHashRef = {
    cell01 => $some_value2a,
    cell02 => $some_value2b,
    cell03 => $some_value2c
};

次に、それをハッシュ全体に追加します。ネストされたperl構造には、他の構造への参照が含まれているだけです。

$topHash{line1} = \%lineHash;
$topHash{line2} = $lineHashRef;

解析するデータの配列をループする例を更新しました

my %topHash;
foreach my $i (0 .. $#data) {
    my %tempHash;
    // stuff here to parse $data[$i] and populate %tempHash
    $topHash{"line$i"} = \%tempHash;
}
于 2009-10-29T16:57:35.943 に答える
1
#!/usr/bin/perl

use strict;

my %HoH = (
    line01 => {
        cell01 => "cell0101",
        cell02 => "cell0102",
        cell03 => "cell0103"
    }
);

$HoH{"line02"}    =
    {
        cell01 => "cell0201",
        cell02 => "cell0202",
        cell03 => "cell0203"
    };

foreach my $hohKey (keys %HoH)
{
    my $newHash = $HoH{$hohKey};
    print "Line Name: $hohKey\n";
    foreach my $key (keys %$newHash)
    {
        print "\t$key => ", $newHash->{$key}, "\n";
    }
}
于 2009-10-29T16:58:37.823 に答える
0

データ行から新しいハッシュを作成するたびに、そのデータをトップ ハッシュ テーブルに格納するための一意のキーを考える必要があります。

my $line = 1;
my %HoH;
while (<>) {
    my ($cell01, $cell02, $cell03, @etc) = split /,/;
    my $newHash = { cell01 => $cell01, cell02 => $cell02, ... };
    my $key = "line$line";
    $HoH{$key} = $newHash;
    $line++;
}

keys(%HoH)のような (ソートされていない) リストを返すようになりまし"line1","line2","line3",...た。
$HoH{"line5"}ファイルの 5 行目のデータへの参照を返します。
%{$HoH{"line7"}}やや醜い構文ですが、7 行目からデータのハッシュテーブルを返します
$HoH{"line14"}{"cell02"}。特定のデータを取得するために使用できます。

于 2009-10-29T17:20:03.697 に答える