Hash复制的问题

Hash复制的问题

perl里面两个hash之间的赋值有些问题,不太明白,求指点
如果用%A=%B赋值,对于简单的hash数组没什么问题,但如果%B是个比较复杂的数据结构的,赋值往往不成功,这是什么原因?
应该怎么解决?

script要有通用性,只能使用perl基本的package,不能使用要去额外下载的包
恐怕还是浅拷贝/深拷贝的问题


QUOTE:
原帖由 MMMIX 于 2009-1-4 15:34 发表
恐怕还是浅拷贝/深拷贝的问题

能具体解释下吗?

难道要foreach keys这样去copy?那如果%B是个散列的数组的散列的数组这样一个复杂数据结构怎么办,而且不知道它到底有多少层
不明白的是%A=%B这种写法到底有什么错?


QUOTE:
原帖由 purbam 于 2009-1-4 16:04 发表


能具体解释下吗?

简单来说就是只拷贝指针而不是拷贝指针指向的内容,这个称为浅拷贝。拷贝指针指向内容的自然就是深拷贝了。

QUOTE:
难道要foreach keys这样去copy?那如果%B是个散列的数组的散列的数组这样一个复杂数据结构怎么办,而且不知道它到底有多少层

你可以参考 Data::Dumper 或者 Test::Deep,看看它们是怎么做的。

我觉得你会出现这种疑问,主要是忽略了一点: 在 Perl 中, array 的元素也好,hash 的值也好,都只能是 scalar,而不能是 array 或 hash 本身。这估计也是让你觉得 %A = %B 应该是深拷贝的原因。

QUOTE:
不明白的是%A=%B这种写法到底有什么错?:shock:

关键在于, Perl 中 hash 的值只能是 scalar, 在 %A = %B 中,%B 会被展成 key/value 的 list,然后用来给 %A 赋值或初始化。若 %B 的值为 reference,那么 %A 得到的是 reference 本身的拷贝,而 reference 所指向的内容是不会被拷贝的。