2012-03-15 103 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