スクリプトの実行中に匿名ハッシュを作成して既知のハッシュに追加するにはどうすればよいですか?
-
10-07-2019 - |
質問
例を使用してこれを説明します。ハッシュハッシュの一般的な例を挙げます。
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をすでに読んだことがある)は、すべてのサブハッシュ(< flintstones"、" jetsons"、" simpsons")が定義されている例を示しているようです。
私がやっていることは、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ハッシュに頭を包もうとしています。
解決
まず、解析している現在の行からハッシュを作成します
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;
}
他のヒント
実行時に匿名ハッシュを追加するには、通常のハッシュ要素と同じように割り当てます:
$HoH{key} = { foo => 42 };
または
$HoH{key} = $hash_ref;
または
$HoH{key} = \%hash;
#!/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";
}
}
データの行から新しいハッシュを作成するたびに、トップハッシュテーブルにそのデータを保存するための一意のキーを考える必要があります。
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++;
}
Now keys(%HoH)
は、&quot; line1&quot;、&quot; line2&quot;、&quot; line3&quot;、...
のような(ソートされていない)リストを返します。
$ HoH {&quot; line5&quot;}
は、ファイルの5行目のデータへの参照を返します。
%{$ HoH {&quot; line7&quot;}}
はkindい構文ですが、データのハッシュテーブルを返します
7行目から。
$ HoH {&quot; line14&quot;} {&quot; cell02&quot;}
は、特定のデータを取得するために使用できます。