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"?!?!?
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