Невозможно использовать строку в качестве хеш-ссылки ..?

Я пытаюсь разобрать HTML-документ для программы веб-индексирования. Для этого я использую HTML :: TokeParser.

Я получаю сообщение об ошибке в последней строке моего первого оператора if:

 if ( $token->[1] eq 'a' ) {
     #href attribute of tag A
     my $suffix = $token->[2]{href};

это говорит Can't use string ("<./a>") as a HASH ref while "strict refs" in use at ./indexer.pl line 270, <PAGE_DIR> line 1.

Моя проблема в том, что (суффикс? Или <./a>?) Является строкой и ее нужно преобразовать в хэш-ссылку? Я смотрел другие сообщения, в которых были похожие ошибки ... но я все еще не уверен в этом. Спасибо за любую помощь.

sub parse_document {

    #passed from input
    my $html_filename = $_[0];

    #base url for links
    my $base_url = $_[1];

    #created to hold tokens
    my @tokens = ();

    #created for doc links
    my @links = ();

    #creates parser
    my $p = HTML::TokeParser->new($html_filename);

    #loops through doc tags
    while (my $token = $p->get_token()) {
        #code for retrieving links
        if ( $token->[1] eq 'a' ) {
            # href attribute of tag A
           my $suffix = $token->[2]{href};

            #if href exists & isn't an email link
            if ( defined($suffix) && !($suffix =~ "^mailto:") ) {
                #make the url absolute
                my $new_url = make_absolute_url $base_url, $suffix;

                #make sure it's of the http:// scheme
                if ($new_url =~ "^http://"){
                    #normalize the url
                    my $new_normalized_url = normalize_url $new_url;

                    #add it to links array
                    push(@links, $new_normalized_url);
                }
            }
        }

        #code for text words
        if ($token->[0] eq 'T') {
            my $text =  $token->[1];

            #add words to end of array
            #(split by non-letter chars)
            my @words = split(/\P{L}+/, $text);
        }
    }

    return (\@tokens, \@links);
}

person mdegges    schedule 31.10.2011    source источник
comment
Я бы распечатал некоторые отладочные операторы, чтобы точно узнать, что, по его мнению, токен, через Data :: Dumper ($ token), а также узнать, что такое $ token - ›[1]. Это могло быть 'или что-то подобное, испорченное ценностями.   -  person scrappedcola    schedule 31.10.2011


Ответы (3)


Метод get_token() возвращает массив, где $token->[2] - хеш-ссылка, содержащая ваш href, только если $token->[0] является S (то есть начальным тегом). В этом случае вы сопоставляете конечный тег (где $token->[0] - это E). Подробности см. В PerlDoc.

Чтобы исправить, добавьте

next if $token->[0] ne 'S';

в верхней части вашего цикла.

person Emil Sit    schedule 31.10.2011
comment
Спасибо! Я подумал, что могу просто пропустить проверку для начального тега, так как я действительно не понимал, для чего он нужен ... но я думаю, что здесь необходимо использовать разрыв. - person mdegges; 31.10.2011

$token->[2] - это строка, а не хеш-ссылка.

Выполните print $token->[2], и вы увидите, что это строка, содержащая </a>

person Brian Roach    schedule 31.10.2011

очевидно, $token->[2] разрешается как ссылка на хэш, значение которой равно "</a>". Уж точно не хочешь ты хочешь!

person ennuikiller    schedule 31.10.2011
comment
На самом деле $token->[2] - это строка ("</a>"), и он пытается использовать ее как ссылку на хэш. - person Brian Roach; 31.10.2011