这是一个有点太渴望评论,但这不是对你的问题的直接回答。
我想弄清楚你的数据结构,我才意识到你可能无法控制。我很好奇为什么你必须处理这个问题,如果你有任何头发或理智,离开。
的多个引用是有点痛苦,但它也让我想起了我用引用做愚蠢的事情,而且我甚至在第一个Perl会议上提出。
当我第一次开始使用的参考,我想,愚蠢,每一个,我想传递一个参考时间我不得不采取的引用,即使事情已经是一个参考。我想最终像$$$$ref
丑陋的东西:
my $string = 'Buster';
some_sub(\$string);
sub some_sub {
my $ref = shift;
some_other_sub(\$ref);
}
sub some_other_sub {
my $ref = shift;
yet_another_sub(\$ref);
}
sub yet_another_sub {
my $ref = shift;
print "$$$$ref\n"; #fuuuuugly!
}
当你开始服用,以引用的聚集,这是我觉得在你的数据结构正在发生这变得更加恶劣。由于对引用的引用只是标量,与原始引用一样,所以不能通过排列下标来对其进行取消引用。因此,您所在的行中的所有$${ }
。
我看不到发生了什么事,直到我从里面开始了,而且当时我只是用试错,直到我得到的东西的工作。
第一级是一个包含在索引1散列引用这不是那么硬或难看的数组引用:
my $j = 'foo';
my $e = 'baz';
my $h = [];
$h->[1] = { foo => 'bar' }; # to get to $$h[1]{$j}
print "1: $h->[1]{$j}\n";
下一个级别是有点怪。要获得$${ ... }{proxy_cache}
,你需要一个散列引用的引用:
$h->[1] = {
foo => \ { proxy_cache => 'duck' } # ref to hash reference
};
print "2. $${ $$h[1]{$j} }{proxy_cache}\n";
我不知道你是如何建立这个数据结构,但是你应该寻找在那里你已经有一个散列引用的地方,而不是采取另一种REF。这是我年轻时做的愚蠢的事情。它可能看起来像这样:
sub some_sub {
my $hash = shift;
$h->[1] = {
foo => \ $hash # don't do that!
};
接下来的一部分并没有那么糟糕。这只是一个普通的散列引用的值(而不是duck
):
$h->[1] = {
foo => \ { proxy_cache => { $e => 'quux' } }
};
print "3. ${ $${ $$h[1]{$j} }{proxy_cache} }{$e}\n";
下一个层次是另一个引用一个散列引用:
$h->[1] = {
foo => \ {
proxy_cache => {
$e => \ { fetch_handler => 'zap' }
}
}
};
print "4. $${ ${ $${ $$h[1]{$j} }{proxy_cache} }{$e} }{'fetch_handler'}\n";
最后,我到最后的关键,ownerDocument
,并指定子程序引用:
$h->[1] = {
foo => \ {
proxy_cache => {
$e => \ { fetch_handler => {
ownerDocument => sub { print "Buster\n" },
}
}
}
}
};
print "5. $${ ${ $${ $$h[1]{$j} }{proxy_cache} }{$e} }{'fetch_handler'}{'ownerDocument'}\n";
输出结果是您已经看到的CODE(0x.......)
。
我想简化,但没有太多,因为那些讨厌的非集合引用删除。这将删除字符排队{$e}
关键的只有三个非空白:
print "6. ";
print $${ $${ $h->[1]{$j} }{proxy_cache}{$e} }{'fetch_handler'}{'ownerDocument'};
print "\n";
谷歌搜索'CODE(0x'不是那么有用[symbolhound.com(http://symbolhound.com/? q = CODE%280X),而另一方面... – mob 2012-03-15 22:11:38