2011-10-31 5 views
3

J'essaie d'analyser un document HTML pour un programme d'indexation Web. Pour ce faire, j'utilise HTML::TokeParser.Vous ne pouvez pas utiliser de chaîne comme une référence de hachage ..?

Je reçois une erreur sur la dernière ligne de ma première instruction if:

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

qui dit Can't use string ("<./a>") as a HASH ref while "strict refs" in use at ./indexer.pl line 270, <PAGE_DIR> line 1.

est mon problème (? Le suffixe ou <./a>) est une chaîne et doit être transformé en un ref de hash? J'ai regardé d'autres messages qui ont eu des erreurs similaires .. mais je ne suis toujours pas du tout sûr de ça. Merci pour toute aide.

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); 
} 
+0

J'imprimer des instructions de débogage pour voir exactement ce qu'il pense jeton via Data :: Dumper (jeton $) et aussi pour voir quel $ jeton -> [1] est. Ce pourrait être un 'ou quelque chose de similaire qui bousillerait les valeurs. – scrappedcola

Répondre

8

La méthode get_token() retourne un tableau où $token->[2] est une référence de hachage contenant vos href que si $token->[0] est un S (qui est une balise de début). Dans ce cas, vous correspondez à une balise de fin ($token->[0] étant un E). Voir le PerlDoc pour plus de détails.

Pour fixer, ajouter un

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

au sommet de la boucle.

+0

Merci! J'ai pensé que je pouvais juste laisser un chèque pour le tag de départ car je ne comprenais pas vraiment à quoi ça servait .. mais je suppose que l'utilisation d'une pause est nécessaire ici. – mdegges

0

apparemment $token->[2] est résoudre une référence de hachage dont la valeur est "</a>". Certainement pas que tu veux!

+2

En fait, '$ token -> [2]' est une chaîne de caractères ('" "') et il essaie de * l'utiliser * comme référence de hachage. –

+0

@Brian oui, merci pour la correction! – ennuikiller

2

$token->[2] est une chaîne, pas une référence de hachage.

Faites un print $token->[2] et vous verrez qu'il est une chaîne contenant </a>

Questions connexes