2012-03-15 38 views
5

perl的我想一些調試模塊代碼,所以我暫時增加了以下行這樣的代碼:「CODE」代表什麼意思?

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

...它打印:

CODE(0x9b2b3e0) 

什麼「CODE 「是指?我預計HASH(0x???????)。我在Perl中很新,所以請給我解釋一下,因爲goooooogling for + Perl + CODE沒有幫助:)

我正在尋找ownerDocumenturl信息,順便說一句。

[更新]

我想使用模塊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中搜索新圖像。我能找到的圖像元素很容易的,但現在我試圖找到信息,他們屬於哪一個文件,因爲我需要用正確的referer信息get他們。某些圖像幀,I幀,腳本等內創建。如果使用不正確引用者信息,那麼它可能會導致不正確的響應,因爲大多數這樣的(new Image()).src='http://...'圖像被用於與cookies跟蹤,而不是真實圖像內容。要獲得文件正確的內容,所有這些特殊的圖像需要正確處理和不正確的引用者它不工作...

+0

谷歌搜索'CODE(0x'不是那麼有用[symbolhound.com(http://symbolhound.com/? q = CODE%280X),而另一方面... – mob 2012-03-15 22:11:38

回答

6

這是一個有點太渴望評論,但這不是對你的問題的直接回答。

我想弄清楚你的數據結構,我才意識到你可能無法控制。我很好奇爲什麼你必須處理這個問題,如果你有任何頭髮或理智,離開。

的多個引用是有點痛苦,但它也讓我想起了我用引用做愚蠢的事情,而且我甚至在第一個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"; 
+2

用戶試圖找出[圖像DOM節點的內容](http://stackoverflow.com/q/9676017)通過[訪問WWW巨大的膽量::腳本編寫者對象(http://stackoverflow.com/a/9689461/46395)。正如你所看到的,實驗的許多天救了他幾個小時瞭解API。 – daxim 2012-03-16 10:42:28

+0

布萊恩,你的回答是我見過的最長的答案。感謝您的時間。我很高興看到有人有這麼高的收視率迴應。請看看我** [更新] **在上面的問題。那個S可以給你更多的信息,我正在嘗試做什麼。謝謝! – 2012-03-16 15:41:51

+0

我有更長的答案,與我的答案相比,我的答案仍然很短。 :) – 2012-03-16 20:23:22

10

這是一個代碼參考,如:

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

謝謝,使感... – 2012-03-15 21:12:41