Perl HTML :: parser错误;未定义的子程序& main :: 1

时间:2011-08-19 00:03:39

标签: perl html-parsing

我收到错误

Undefined subroutine &main::1 called at /usr/local/lib/perl/5.10.0/HTML/Parser.pm line 102.

这是我的代码

#open (IN,  "<", "foo.html") or die "can't open source file: $!";

my $p = HTML::Parser->new( api_version => 3,
            start_h => [&start, "tagname, attr, text"],
            text_h  => [&text,  "text"],
            default_h   => [sub { print OUT shift }, "text"],
        );
$p->utf8_mode;
$p->empty_element_tags;
$p->ignore_elements(qw(br));

$p->parse_file("foo.html") or die "parsing failed: $!";
#while (<IN>) {
#    $p->parse($_) || die "parsing failed: $!";
#}
#$p->eof;
#close IN;

正如您在注释掉的部分中所看到的,我也尝试直接打开并调用解析(运气同样不大)。

文件打开正常。

Parser.pm第102行是错误提及的是parse_file子例程,特别是行调用 - &gt;解析

我不知道parse在哪里,它不在HTML :: Parser中,也没有在HTML :: Entities中找到HTML :: Parser唯一的依赖。 = /我担心我在这一点上迷失了,PERL最深的魔法对我来说仍然是一个谜。

2 个答案:

答案 0 :(得分:7)

尝试使用\&start\&text

my $p = HTML::Parser->new( api_version => 3,
        start_h => [\&start, "tagname, attr, text"],
        text_h  => [\&text,  "text"],
        default_h   => [sub { print OUT shift }, "text"],
    );

否则,您传递的是调用start()text()的结果,而不是作为潜艇的引用。

答案 1 :(得分:3)

在文档中,它说你应该使用\&start。如果排除反斜杠,它将使用函数start的返回值(将使用@_作为参数列表,按照正常子例程使用&调用编译指示)。该值可以是1

以下是一个例子:

C:\perl>perl -we "$c=\&s; sub s { print 'yada' }; $c->();"
yada
C:\perl>perl -we "$c=&s; sub s { print 'yada' }; $c->();"
Undefined subroutine &main::1 called at -e line 1.
yada

不确定为什么会出现错误,但您可能会更改错误,看看是否有帮助。

哦,看起来好像你没有使用use strict。使用严格时,我得到一个更有帮助的错误:

C:\perl>perl -we "use strict; my $c=&s; sub s { print 'a' }; $c->();"
Can't use string ("1") as a subroutine ref while "strict refs" in use at -e line