You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:27:03