Perl哈希数组替换值后二次遍历全为最后一个值问题求助
问题根因
你代码里的@row_buff = (@row_buff) x $itercnt;操作是问题的核心来源:
- 你存入
@row_buff的元素都是哈希引用(通过push @row_buff, \%hash;写入),Perl的x复制运算符只会做浅拷贝:仅复制引用的内存地址,不会复制引用指向的实际哈希数据。最终复制得到的新@row_buff里所有元素,都指向同一个哈希内存空间。 - 第一层循环打印看起来正常的原因是:你赋值后立刻打印当前值,第一次赋值把共享哈希的
offset设为string_a,马上打印就是string_a;第二次赋值直接覆盖共享哈希的offset为string_b,马上打印就是string_b,直到最后一次赋值为string_d。所有赋值操作本质都是修改同一个哈希的同一个字段,每次都会覆盖上一次的结果。 - 第二层循环是全部赋值完成后统一打印,此时共享哈希的
offset已经被最后一次赋值覆盖为string_d,不管读取数组中哪个元素的offset,都是读取同一个共享哈希的值,所以结果全是string_d。
修复方案
如果要实现数组带哈希内容的完整复制,需要对每个哈希做深拷贝,不能直接用x操作符。把你原来的@row_buff = (@row_buff) x $itercnt;替换为以下代码即可:
# 先保留原数组的内容 my @original_buff = @row_buff; @row_buff = (); # 循环复制指定次数,每次都生成新的哈希引用 for (1..$itercnt) { push @row_buff, map { +{ %$_ } } @original_buff; }
代码里的+{ %$_ }会取出原有哈希引用的所有键值,生成一个全新的哈希引用,保证数组每个元素指向的哈希都是独立的,修改不会互相影响。
内容的提问来源于stack exchange,提问作者Vishnu 3333
相关产品推荐
相关产品推荐

