"CODE"对变量意味着什么?

Ωme*_*ega 5 perl

perl中我想调试一些模块代码,所以我暂时将以下行添加到这样的源代码中:

 print $${${$${$$h[1]{$j}}{proxy_cache}}{$e}}{'fetch_handler'}{'ownerDocument'}
Run Code Online (Sandbox Code Playgroud)

...它打印:

 CODE(0x9b2b3e0)
Run Code Online (Sandbox Code Playgroud)

"CODE"是什么意思?我期待HASH(0x???????).我是Perl的新手,所以请解释一下,因为+ Perl + CODE的goooooogling没有帮助:)

我一直在寻找urlownerDocument信息,顺便说一句.

[UPDATE]

我正在尝试使用模块WWW::Scripter满足我的需求,我已经发现了几个错误,这个模块的作者(父亲Chrysostomos)已根据我的输入修复.

现在我正在"调试"使用JavaScript动态创建的图像的某些问题(例如((new Image()).src='http://...'),因为这些图像现在不包含在$w->images结果中.

如果你看看sub update_html模块源代码[http://cpansearch.perl.org/src/SPROUT/WWW-Scripter-0.026/lib/WWW/Scripter.pm],有一行以

       $h && $h->eval($self, $code  ...
Run Code Online (Sandbox Code Playgroud)

这是我需要调试的部分.在评估脚本后,我试图在DOM中"搜索"新图像.我能够很容易地找到图像元素,但现在我正在尝试查找它们所属的文档的信息,因为我需要get正确的referer信息.一些图像是在帧,iframe,脚本等中创建的.如果使用不正确的引用信息,则可能导致不正确的响应,因为大多数此类(new Image()).src='http://...'图像用于跟踪cookie,而不是用于真实图像内容.为了获得正确的文档内容,所有这些特殊图像都需要正确处理,没有正确的引用它不起作用......

cjm*_*cjm 10

这是代码参考,例如:

my $var = sub { ... };
print "$var\n";
Run Code Online (Sandbox Code Playgroud)


bri*_*foy 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!
    }
Run Code Online (Sandbox Code Playgroud)

当您开始参考聚合时,这会变得更糟,这是我认为在您的数据结构中发生的事情.由于对引用的引用只是标量,与原始引用一样,因此不能通过排列下标来取消引用它.因此,$${ }你的所有行.

在我从内到外开始之前我无法看到发生了什么,即便如此,我只是尝试了反复试验,直到我得到了有用的东西.

第一级是一个数组引用,它包含索引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";
Run Code Online (Sandbox Code Playgroud)

下一个级别有点奇怪.要获取$${ ... }{proxy_cache},您需要引用哈希引用:

$h->[1] = { 
    foo => \ { proxy_cache => 'duck' } # ref to hash reference 
    };   

print "2. $${ $$h[1]{$j} }{proxy_cache}\n";
Run Code Online (Sandbox Code Playgroud)

我不确定你是如何构建这个数据结构的,但是你应该寻找已经有哈希引用的地方而不是另外一个引用.那是我年轻时做的蠢事.它可能看起来像这样:

sub some_sub {
    my $hash = shift;

    $h->[1] = { 
        foo => \ $hash   # don't do that!
        };
Run Code Online (Sandbox Code Playgroud)

下一部分并不是那么糟糕.它只是一个常规的哈希引用作为值(而不是duck):

$h->[1] = { 
    foo => \ { proxy_cache => { $e => 'quux' } }
    };   

print "3. ${ $${ $$h[1]{$j} }{proxy_cache} }{$e}\n";
Run Code Online (Sandbox Code Playgroud)

下一级是对哈希引用的另一个引用:

$h->[1] = { 
    foo => \ { 
        proxy_cache => { 
            $e => \ { fetch_handler => 'zap' } 
            } 
        }
    };   

print "4. $${ ${ $${ $$h[1]{$j} }{proxy_cache} }{$e} }{'fetch_handler'}\n";
Run Code Online (Sandbox Code Playgroud)

最后,我到达最后一个键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";
Run Code Online (Sandbox Code Playgroud)

输出就是CODE(0x.......)你已经看到的.

我想简化它,但由于那些讨厌的非聚合引用而没有太多要删除.这样只会删除三个非空白字符以排列{$e}键:

print "6. ";

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

print "\n";
Run Code Online (Sandbox Code Playgroud)

  • 用户试图通过[访问巨大的WWW :: Scripter对象的内容]来找出[图像DOM节点的内容](http://stackoverflow.com/q/9676017)(http://stackoverflow.com/一个/四万六千三百九十五分之九百六十八万九千四百六十一).正如您所看到的,经过多天的实验,他花了几个小时来理解API. (2认同)