これは少しもあり長い間、コメントのために、それはあなたの質問への直接の答えではありません。
あなたのデータ構造を把握したいと思っていましたが、あなたが制御できないことを十分に認識しています。私はあなたがそれに対処しなければならない理由が不思議で、もしあなたに髪の毛や正気が残っていたら、残しておきます。
複数のリファレンスは少し痛いですが、私が以前に参照したばかげたことを思い起こさせ、最初のPerlカンファレンスでも発表しました。
最初にリファレンスを使用し始めたとき、リファレンスを渡すたびに参照が必要なたびにリファレンスが既に参照されていたとしても、私は馬鹿馬鹿しく思った。あなたは私はあなたのデータ構造で何が起こっていると思うものです骨材への参照を取り始めるとき、これがさらに悪化する
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!
}
:私は$$$$ref
のような醜い何かで終わるだろう。参照への参照は元の参照と同様にスカラーだけなので、添え字を一列に並べることで逆参照することはできません。したがって、あなたの行にある$${ }
のすべて。
私は内側から始めるまで何が起こっているのか分からなかったし、それでも私は仕事をするまで試行錯誤しました。
my $j = 'foo';
my $e = 'baz';
my $h = [];
$h->[1] = { foo => 'bar' }; # to get to $$h[1]{$j}
print "1: $h->[1]{$j}\n";
次のレベルは少し奇妙である:
最初のレベルはとても硬いまたは醜いないインデックス1でハッシュリファレンスを含む配列リファレンスです。私はあなたがこのデータ構造を構築しているかわからないんだけど、あなたはすでにハッシュリファレンスを持っているし、別のものを取らない場所を探す必要があり
$h->[1] = {
foo => \ { proxy_cache => 'duck' } # ref to hash reference
};
print "2. $${ $$h[1]{$j} }{proxy_cache}\n";
:$${ ... }{proxy_cache}
を取得するには、ハッシュリファレンスを参照する必要がありますref。それは私が若い時にやっていたばかげたことです。
sub some_sub {
my $hash = shift;
$h->[1] = {
foo => \ $hash # don't do that!
};
次の部分はそれほど悪くはありません。
$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 => 'quux' } }
};
print "3. ${ $${ $$h[1]{$j} }{proxy_cache} }{$e}\n";
:それは(代わりにduck
の)値として普通のハッシュリファレンスです、およびサブルーチンのリファレンスを割り当てます
は
$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.......)
です。
私はそれを単純化したいと思いましたが、厄介な非集約参照のために削除することはあまりありません。
print "6. ";
print $${ $${ $h->[1]{$j} }{proxy_cache}{$e} }{'fetch_handler'}{'ownerDocument'};
print "\n";
'CODE(0x'はそれほど有用ではありません[symbolhound.com](http://symbolhound.com/のGoogle検索:。これは
{$e}
キーを並べるために文字の唯一の3つの非空白文字を削除しますか? q = CODE%280x)... – mob