我收到错误
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最深的魔法对我来说仍然是一个谜。
答案 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