【发布时间】:2011-02-27 16:31:05
【问题描述】:
下面第 9 行的代码创建了哈希的本地副本。对 %d 的任何更改都不会提供对全局 %h 变量的更改(第 5 行)。我必须使用参考(第 8 行)来提供对 %h 的更改。
有没有办法在不创建本地副本的情况下取消引用 sub 中的哈希? 我在问,因为我有许多引用的复杂记录,并且通过取消引用在它周围导航会容易得多。
1 #!/usr/bin/perl -w
2 use strict;
3 use warnings;
4
5 my %h;
6 sub a {
7
8 my $href = shift;
9 my(%d) = %{$href}; # this will make a copy of global %h
10
11 $$href{1}=2; # this will make a change in global %h
12 $d{2}=2; # this will not a change in global %h
13 }
14 a(\%h);
15 print scalar (keys %h) . "\n";
----------------
感谢您的回复。
问题是我可以在 sub 中对 %h 进行某种“别名/绑定”吗? 我想用 %d 更改子中 %h 的上下文。 每当我创建 %d 时,他都会制作 %h 的本地副本 - 有什么办法可以避免这种情况,还是我必须一直使用引用?
----------------
再来一次 :) 我知道 $href 是如何工作的。我阅读教程/手册/文档等。 我没有在那里找到答案 - 我认为这是不可能的,因为它没有写在那里,但谁知道呢。
我想完成这样的行为:
6 sub a {
7 $h{"1"}=2;
8 }
相当于:
6 sub a {
8 my $href = shift;
11 $$href{1}=2; # this will make a change in global %h
11 $href->{1}=2; # this will make a change in global %h
现在如何在 %d 的帮助下做到这一点 - 真的有可能吗?
6 sub a {
7 my %d = XXXXXXXXX
.. }
在不创建本地副本的情况下,我应该在 XXXXXXXXX 下放置什么来指向 %h?
【问题讨论】:
-
出于好奇——您列出的两种方法(使用 $$ 和箭头运算符的内联取消引用)有什么问题?
-
$$ 没问题。我只是好奇。
标签: perl hash dereference