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

Perl中如何对哈希进行浅拷贝?修改原哈希不影响数组元素

解决Perl哈希存入数组后修改原哈希不影响数组内容的问题

首先纠正你代码里的两个明显笔误:

  • 哈希元素赋值应该用$h{foo} = 1;(单个哈希元素用标量变量符号$),而非%h{foo} = 1;
  • push(@a, \%x);里的\%x应为\%h,你的哈希变量是%h

你的核心问题是:当前push的是原哈希的引用,数组里存储的是指向原%h的指针,所以后续清空%h会直接影响数组里引用指向的内容。要实现修改原哈希不影响数组,需要把哈希的拷贝存入数组,而非原哈希的引用。

因为你的哈希仅包含字符串值,浅拷贝完全足够,有两种简洁的实现方式:

方法1:显式创建拷贝哈希

my @a;
my %h;
$h{foo} = 1;
# 创建新哈希并复制原哈希的所有键值对
my %h_copy = %h;
# 将新哈希的引用存入数组
push(@a, \%h_copy);
# 清空原哈希,数组里的拷贝不受影响
%h = ();

方法2:用匿名哈希直接拷贝(更简洁)

my @a;
my %h;
$h{foo} = 1;
# 创建匿名哈希并复制原哈希内容,直接存入数组
push(@a, { %h });
# 清空原哈希,数组里的匿名哈希独立不受影响
%h = ();

原理说明:{ %h }会生成一个全新的匿名哈希,把原%h的所有键值对复制到这个新哈希中,然后返回新哈希的引用。数组里存储的是这个新哈希的引用,和原%h没有关联,后续修改原哈希不会影响数组内的内容。

内容的提问来源于stack exchange,提问作者yegor256

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:50:15