Perl HTML :: ошибка парсера;Неопределенная подпрограмма и главная :: 1 - PullRequest
3 голосов
/ 19 августа 2011

Я получаю ошибку

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, в частности, строка вызова -> parse

Я понятия не имею, где находится parse, он не в HTML :: Parser, и я не нашел его в HTML :: Entities, который имеет единственная зависимость HTML :: Parser. = / Я боюсь, что в этот момент я потерялся, самая глубокая магия PERL все еще остается для меня загадкой.

Ответы [ 2 ]

7 голосов
/ 19 августа 2011

Попробуйте использовать \&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(), а не ссылки на них как подпрограммы.

3 голосов
/ 19 августа 2011

В документации сказано, что вы должны использовать \&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
...