不,您引用的语法不会创建副本.
这个表达式:
%{$hash_ref}
完全等同于:
%$hash_ref
并且假设$hash_ref
标量变量确实包含对散列的引用,那么%
在前面添加简单地"解除引用"引用 - 即它解析为表示底层散列($hash_ref
指向的东西)的值.
如果查看每个函数的文档,您会看到它希望将哈希作为参数.把%
你的东西放在hashref上是如何提供哈希的.
如果您编写了自己的子例程并将哈希传递给它,就像这样:
my_sub(%$hash_ref);
然后在某种程度上你可以说哈希被"复制"了,因为在子程序中,特殊@_
数组将包含来自哈希的所有键/值对的列表.但即使在这种情况下,@ _的元素实际上是键和值的别名.如果您执行以下操作,您实际上只能获得一份副本:my @args = @_
.
Perl的内置each
函数使用原型'+'声明,它有效地将哈希(或数组)参数强制转换为对底层数据结构的引用.
另外,从版本5.14开始,该each
函数也可以引用哈希.所以代替:
($key, $value) = each(%{$hash_ref})
你可以简单地说:
($key, $value) = each($hash_ref)