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
相关产品推荐
相关产品推荐

