這是一個有點太渴望評論,但這不是對你的問題的直接回答。
我想弄清楚你的數據結構,我才意識到你可能無法控制。我很好奇爲什麼你必須處理這個問題,如果你有任何頭髮或理智,離開。
的多個引用是有點痛苦,但它也讓我想起了我用引用做愚蠢的事情,而且我甚至在第一個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