我下面的代码创建散列的本地副本。对%d的任何更改都不会提供对全局%h变量(行:5)的更改。我必须使用参考(行:8)来提供对%h的更改。取消引用散列而不创建本地副本
有没有什么办法可以在不创建本地副本的情况下对子文件中的散列进行反引用? 我在问,因为我有复杂的记录与许多参考和导航周围与解除引用会更容易。
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";
----------------
感谢您的答复。
问题是我可以在子节点中为%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,而无需创建一个本地副本?
出于好奇 - 你列出的两种方法($$和箭头运算符的内联解除引用)有什么问题? – 2010-06-04 12:05:48
$$是okey。我只是好奇。 – name 2010-06-05 10:48:33