Perl哈希添加值问题:如何向par3的二级结构添加元素
Perl哈希嵌套数组的元素添加方案
首先要纠正你示例里的结构问题:Perl数组中不能直接写'par3' => ['par4',...]这种键值对,这会被解析成两个独立的数组元素('par3'和那个数组引用),完全没法实现你“par3下挂数组”的需求。下面给两种合理的结构方案,以及对应的添加元素代码:
方案一:哈希嵌套(推荐,靠键名匹配更可靠)
把obj1对应的结构改成哈希,这样可以通过键名精准匹配par1、par2、par3:
初始化结构
my %a = ( 'obj1' => { 'par1' => '', # par1/par2如果只是标识,值可以设为空或undef 'par2' => '', 'par3' => ['par4', 'par5', 'par6'] } );
匹配并添加元素
先检查各层级是否存在,确保par3是数组引用,再push新元素:
my $new_item = 'par7'; # 要添加的新元素 if (exists $a{'obj1'} && exists $a{'obj1'}{'par1'} && exists $a{'obj1'}{'par2'} && exists $a{'obj1'}{'par3'} && ref $a{'obj1'}{'par3'} eq 'ARRAY') { push @{$a{'obj1'}{'par3'}}, $new_item; }
方案二:数组嵌套哈希(不推荐,靠位置匹配易出错)
如果你坚持要用数组结构,就得把par3和它的数组放到一个哈希里,作为数组的第三个元素:
初始化结构
my %a = ( 'obj1' => [ 'par1', 'par2', { 'par3' => ['par4', 'par5', 'par6'] } ] );
匹配并添加元素
通过数组下标匹配前两个元素,再定位到par3的数组:
my $new_item = 'par7'; if ($a{'obj1'}[0] eq 'par1' && $a{'obj1'}[1] eq 'par2' && ref $a{'obj1'}[2] eq 'HASH' && exists $a{'obj1'}[2]{'par3'} && ref $a{'obj1'}[2]{'par3'} eq 'ARRAY') { push @{$a{'obj1'}[2]{'par3'}}, $new_item; }
补充说明
你原来的代码push @{$a{$obj}},$par1,$par2,$par3是把三个元素直接push到obj1对应的数组里,这只能构建扁平数组,没法实现嵌套结构。如果要动态构建嵌套结构,方案一可以改成:
# 动态构建obj1的哈希结构 $a{'obj1'}{'par1'} = ''; $a{'obj1'}{'par2'} = ''; $a{'obj1'}{'par3'} = ['par4', 'par5', 'par6'];
内容的提问来源于stack exchange,提问作者Dana
相关产品推荐
相关产品推荐

