2012-03-15 8 views
5

perlのでは、私はいくつかのモジュールのコードをデバッグしたかったので、私は一時的なソースコードに次の行を追加:"CODE"は変数の意味は何ですか?

print $${${$${$$h[1]{$j}}{proxy_cache}}{$e}}{'fetch_handler'}{'ownerDocument'} 

...そしてそれが出力します。

CODE(0x9b2b3e0) 

何「CODE " 手段?私は期待したHASH(0x???????)。私はPerlでかなり新しいです、+ Perlの+コードのgooooooglingは役に立たないよう:)

ので、私はところで、ownerDocument情報のurlを探していた、私はこのことを説明してください。

[UPDATE]

私は自分のニーズに合わせてモジュールWWW::Scripterを使用しようとしていますし、私はすでに私の入力に基づいて、このモジュールの作者(父Chrysostomos)がすでに固定することをいくつかのバグを発見しました。

JavaScriptで動的に作成された画像(「((new Image()).src='http://...'」など)の問題を「デバッグ」しています。現在、画像は$w->imagesの結果に含まれていません。

あなたはモジュールのソース [http://cpansearch.perl.org/src/SPROUT/WWW-Scripter-0.026/lib/WWW/Scripter.pm]sub update_htmlを見てみる場合は、

 $h && $h->eval($self, $code ... 

これは私がデバッグする必要があるセクションで始まる行があります。私はスクリプトが評価された後にDOMで新しい画像を "検索"しようとしています。私は画像要素をかなり簡単に見つけることができましたが、今ではgetに正しいrefererという情報が必要なので、その文書が属する文書の情報を見つけようとしています。不適切なリファラ情報が使用されると、そのような画像のほとんどが実際の画像コンテンツではなくクッキーで追跡されるため、不正な応答につながる可能性があります。それは動作しませんリファラ文書の正しいコンテンツを取得するには、すべてのこれらの特別なイメージが適切に処理され、正しいなしにする必要があります...

+0

'CODE(0x'はそれほど有用ではありません[symbolhound.com](http://symbolhound.com/のGoogle検索:。これは{$e}キーを並べるために文字の唯一の3つの非空白文字を削除しますか? q = CODE%280x)... – mob

答えて

6

これは少しもあり長い間、コメントのために、それはあなたの質問への直接の答えではありません。

あなたのデータ構造を把握したいと思っていましたが、あなたが制御できないことを十分に認識しています。私はあなたがそれに対処しなければならない理由が不思議で、もしあなたに髪の毛や正気が残っていたら、残しておきます。

複数のリファレンスは少し痛いですが、私が以前に参照したばかげたことを思い起こさせ、最初の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"; 
+2

ユーザーは[画像DOMノードの内容]を把握しようとしています(http://stackoverflow.com/q/9676017) (WWW :: Scripterの巨大なオブジェクトにアクセスすることによって)(http://stackoverflow.com/a/9689461/46395)ご覧のとおり、数日間の実験により、APIを理解するのに2時間もかかりませんでした。 – daxim

+0

ブライアン、あなたの答えは私が今まで見た中で最も長い答えです。あなたの時間をありがとうございます。高い評価を得て誰かが応えてくれてうれしいです。上記の質問で私の** [UPDATE] **を見てください。私は何をしようとしているか、あなたにいくつかの情報を与える必要があります。ありがとうございました! –

+0

私ははるかに長い答えを持っています、そして、私のものは、tchristのものに比べてまだ短いです。 :) –

10

それは例えば、コードの参照です:

my $var = sub { ... }; 
print "$var\n"; 
+0

ありがとうございます... –

関連する問題