2010-06-07 7 views
0

Ce simple script Perl traduit des articles d'une base de données en XML, mais cette section me cause des problèmes. La fonction makeUrl est appelée pour chaque article, mais doit s'assurer que les URL en double ne sont pas créées.La fonction de tableau perl simple ne fonctionne pas

my @headlines =(); 
my $hlCount = 1; 
. 
. 
. 

sub makeUrl { 
    my $headline; 
    open(URLSOUT, '>>/var/mtkoan/harris/urls'); 

    $url = $_[0]; 
    print URLSOUT "Before: $url\n"; 
    $url =~ s/\x{90}//g; 
    $url =~ s/\s+$//g; 
    $url =~ s/^\s+//g; 
    $url =~ s/\s/_/g; 
    $url =~ s/\W//g; 

    push @headlines, $url; 
    foreach $headline (@headlines) { 
    if($headline eq $url) { 
     $url .= "_$hlCount"; 
     $hlCount++; 
    } 
    } 

    print URLSOUT "After: $url\n\n"; 
    print URLSOUT "Headline Array Dump:\n"; 
    print URLSOUT "@headlines\n"; 
    close URLSOUT; 
} 

Lorsque le tableau est imprimé, seule la dernière valeur est affichée. Push n'est pas ajouté à la fin du tableau, je ne peux pas le comprendre!

+0

voici le script complet: http://pastebin.com/6SXe5ZSd – mtkoan

+2

Oof, Switch. Cette chose peut causer des problèmes désagréables. Envisagez de réécrire en utilisant donné/quand (si vous êtes sur 5.10 ou plus récent) ou si/sinon autrement. Switch est juste joli; cela ne va pas vraiment accélérer le programme. –

+0

Je ne vois pas pourquoi ça ne marche pas, mais il serait plus logique d'utiliser un hachage au lieu d'un tableau. Ensuite, vous n'auriez pas besoin de faire une boucle dans le tableau pour voir s'il y a un dupe; ce serait juste une simple recherche de hash. – cjm

Répondre

0

Vous pouvez vérifier l'unicité (et supprimer les doublons dans une liste) de deux façons:

Avec un hachage:

my %urls; 
    # construct your URL in the function... 
    $urls{$url}++; 

    # get all the (unique) URLs: 
    my @urls = keys %urls; 

Avec un appel de bibliothèque qui renvoie les valeurs uniques dans une liste (voir List::MoreUtils):

use List::MoreUtils 'uniq`; 
    @urls = uniq @urls;