继续我之前的问题,我遇到了另一个问题。我意识到不仅哈希中应该有哈希,哈希中也可以有数组。所以路径会是这样的
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?
)并有效地删除和重命名散列的键?
谢谢。