これが他の場所で解決されている場合はお詫び申し上げます。探して探しました。
各チャンクの名前を左揃えにし、各名前の引数をインデントすることで、データのチャンクを分離する構成ファイルを使用しています (以下を__DATA__
参照)。$hash{name}
スカラー値を%hash{args}
指すキーと、値の配列を指すキーを持つハッシュに各チャンクを格納するスクリプトを作成しました。各チャンクは独自のハッシュに格納されるため、ハッシュへの参照は匿名で配列に格納されます。最終的には、これらのハッシュを 1 つずつ取得して値を処理したいと考えていますが、配列の反復処理に問題があります。
各ハッシュに格納されている値を出力しようとすると、リスト コンテキストでその配列のハッシュ参照を取得しているように見えるため、%hash{args} が 3 つの要素を持つ配列への参照である場合、それは foreach ループの 3 倍になります。実行します。
そのループ内のコードを、その配列に吸い込んだハッシュ参照ごとに 1 回だけ実行するにはどうすればよいですか?
私の出力を確認すると、ネストされた配列参照を逆参照する必要があることは明らかですが、ループを正しくすることに固執しているため、まだそれに取り組むことができませんでした。多分解決策は両方を修正しますか?
見よ:
use strict;
use warnings;
my @array;
my %hash;
my ($name, $args);
while (my $line = <DATA>) {
chomp($line);
if ($line !~ /^\s/)
{
my ($key) = $line =~ /^\S+/g;
$hash{name} = $key;
print "Defined a name $key\n";
}
else
{
$line =~ s/^\s+//;
push (@{ $hash{args} }, $line);
print "Defined an arg $line\n";
}
push (@array, \%hash);
}
foreach my $i (@array)
{
foreach my $h (keys %{$i})
{
print $h . "\t";
print $i->{$h} . "\n";
}
}
__DATA__
Sports
Basketball
Tennis
Boxing
Guys
Tom
Dick
Harry
出力は次のとおりです。
Defined a name Sports
Defined an arg Basketball
Defined an arg Tennis
Defined an arg Boxing
Defined a name Guys
Defined an arg Tom
Defined an arg Dick
Defined an arg Harry
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys
args ARRAY(0x4a8e24)
name Guys