2009-01-21 6 views
-1

J'ai le code Perl suivant:Pourquoi cette expression rationnelle Perl échoue-t-elle?

my $progName = shift ; 

open(IPLAYERLIST, "iplayer-list.html") or die "Cannot open iplayer index file iplayer-list.html\n" ; 
while (<IPLAYERLIST>) { 

    if (/($progName)/is) { 
    #if (/Just A Minute/is) { <-- This works! 
     my $iplayerID = $1 ; 
     print "IPlayer program id for $progName is $iplayerID\n" ; 

     # === do stuff here === 
    } 
    else 
    { 
     print "Failed to match $progName in $_\n"; 
    } 
} 

IPLAYERLIST est une liste BBC iPlayer il est donc à la recherche d'un nom de programme spécifique.

Si j'appelle cela avec $progName = "Just A Minute", il ne correspond pas, même si la chaîne est dans le fichier. Si je l'appelle avec un seul caractère, par exemple "M" alors il réussit. Si je remplace la variable $progName par une chaîne constante ("Just A Minute"), elle réussit. Quand il imprime $progName il imprime toujours la chaîne correcte donc je ne peux pas voir comment l'expression rationnelle pourrait obtenir quelque chose de différent.

J'ai coupé le code et collé dans un script de test:

#!/usr/bin/perl 
use strict ; 

my $searchstr = "foo bar Just A Minute baz boo" ; 
my $progName = $ARGV[0] ; 
print "searching for [$progName] in [$searchstr]\n" ; 
if ($searchstr =~ /$progName/is) { 
    print "Well the test worked\n" ; 
} else { 
    print "Failed to match [$progName] in [$searchstr]\n"; 
} 

et qui fonctionne très bien. Alors pourquoi le premier exemple ne trouve-t-il pas "Just A Minute" dans un fichier contenant "Just A Minute"?!?!?

+0

Comment lancez-vous cela? J'ai pris votre premier exemple, créé le iplayer-list.html avec seulement "Just A Minute" dedans et a couru avec: $ ./tmp.pl 'Juste une minute' et cela a bien fonctionné pour moi – tddmonkey

Répondre

0

Il ne semble pas y avoir de problème avec votre exemple. Cela fonctionne très bien dans mes tests.

Pouvez-vous nous donner la sortie d'erreur complète que vous voyez, comme dans la sortie "Impossible de faire correspondre X en Y"?

La seule chose que je peux penser est que $progName n'est pas réglé à la bonne valeur. Voir la sortie d'erreur complète l'exclurait.

1

Votre programme (le premier) fonctionne très bien pour moi.

Notez que vous devez citer l'argument sting (parce qu'il contient des espaces), sinon vous cherchez simplement une correspondance avec "Just". Alors courez comme ça ...

perl de "Just A Minute"

je l'ai couru avec ce fichier d'entrée:

Foo 
Just A Minute 
Bar 

qui sort ...

Failed to match Just A Minute in Foo 

IPlayer program id for Just A Minute is Just A Minute 
Failed to match Just A Minute in Bar 

Notez les lignes vides après les lignes Foo et Bar. C'est parce que vous ne coupez pas les nouvelles lignes sur les lignes lues dans le fichier. Il y a donc un "\ n" à la fin de "Foo \ n" et "Bar \ n" qui est imprimé dans la sortie. Mais cela n'affecte pas la correspondance.

0

Vérifiez votre fichier html.

Je courais le suivant

my $progName = shift ; 

open(IPLAYERLIST, "list.txt") or die "Cannot open iplayer index file\n" ; 
while (<IPLAYERLIST>) { 

     if (/($progName)/is) { 
     #if (/Just A Minute/is) { <-- This works! 
       my $iplayerID = $1 ; 
       print "IPlayer program id for $progName is $iplayerID\n" ; 

       # === do stuff here === 
     } 
     else 
     { 
       print "Failed to match $progName in $_\n"; 
     } 
} 

avec le fichier suivant list.txt:

egg 
spam 
foo bar Just A Minute baz boo 
egg spam Just A Minute spam egg 
foo 
bar 

Il semble fonctionner, la sortie pour perl prog.pl "just a minute" est

Failed to match just a minute in egg 

Failed to match just a minute in spam 

IPlayer program id for just a minute is Just A Minute 
IPlayer program id for just a minute is Just A Minute 
Failed to match just a minute in foo 

Failed to match just a minute in bar 
0

Je vais essayer de poster un meilleur test avec des résultats, etc demain. Je devrai extraire la fonction et l'emballer en premier. En ce moment, il est temps pour le lit!

0

Si votre liste est en HTML, quelle garantie avez-vous que la "Just A Minute" que vous voyez dans un navigateur est en réalité "Juste une minute" dans votre code source?

Il pourrait être

Just A Minute (extra spaces) 
Just 
A 
Minute 
Just <!--comment-->A Minute 
Just[the nbsp entity]A Minute 

et ainsi de suite et ainsi de suite.

Montrez-nous le code HTML.

0

J'ai extrait toute la fonction dans un programme de test et il fonctionnait parfaitement! Je vais devoir passer du temps à isoler la question avant de renvoyer cette question. À l'heure actuelle, il me semble que je devrais publier le programme complet de 700 lignes, avec des fichiers de support et des instructions pour permettre aux gens de le tester, ce qui dépasse la portée de stackoverflow.

--- Alistair.

Questions connexes