前の質問の続きで、別の問題に遭遇しました。ハッシュ内にハッシュが存在するだけでなく、ハッシュ内に配列が存在する可能性があることに気付きました。したがって、パスは次のようになります
one/two/three
one/two[]/three
one/two/four
one/two[]/four
つまり、ハッシュには配列が含まれていると想定されており、常に[]
サフィックスとして a が付きます。私が使用しているスクリプト(以前の質問の回答を少し修正したバージョン)によると、上記のパスは次のようになります。
one => {
two => {
three => "",
four => "",
}
two[] => [
{
three => "",
four => "",
}
]
}
私が使用しているスクリプトは次のとおりです。
# !/usr/bin/perl
use Data::Dumper;
sub insert {
my ($ref, $head, @tail) = @_;
if ( @tail ) {
if( $head !~ /^(.*)(\[\])$/ ) {
insert( \%{$ref->{$head}}, @tail );
} else {
my %newhash = ();
unshift(@{$ref->{$1 . $2}}, %newhash);
insert( \%{$ref->{$1 . $2}[0]}, @tail );
}
} else {
$ref->{$head} = '';
}
}
my %hash;
chomp and insert \%hash, split( '/', $_ ) while <>;
print Dumper %hash;
私がやりたいことは、 が見つかったら、それtwo[]
を削除して(存在する場合)two
の配列に追加し、キーの名前を に変更することです。two[]
two
two[]
two
したがって、最終結果は次のようになります。
one => {
two => [
{
three => "",
four => "",
},
{
three => "",
four => "",
}
]
}
そのため、サフィックスif else
の有無にかかわらずキーをチェックするためにチェックを追加しようとしましたが、などの範囲またはエラーが発生しました。[]
[$variable] is not a valid HASH reference
$ref->{$head} is array?
ありがとう。