[PERL] expression reg again ...

Fermé
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 - 26 août 2010 à 16:09
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 26 août 2010 à 19:24
re-Bonjour,


J'ai finalement activer strict et warning sur un de mes vieux code et je suis confronté à une bêtise .. pas de cambrais :

la ligne
if ($to && $to ne "" && $status =~ m/(valeur1|valeur2|valeur3)/i ){

me renvoie l'erreur :
Use of uninitialized value in pattern match (m//)

quand la ligne du fichier ne contient ni valeur1, ni valeur2, ni valeur3 ... dois-je ajouter un test d'existence ? je pensais que le m correspondait à match .... je comprend plus

Stéphane
A voir également:

4 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 août 2010 à 16:15
Salut,

Affiche ton if complet.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 26/08/2010 à 16:18
Re,

Sinon j'aurais écrit comme ça


if( $status =~ m/(valeur1|valeur2|valeur3)/i){  
  if ($to ne ""){  
  .....  
  }  
}else{  
 ...  
}
--
GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
106485010510997108
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
26 août 2010 à 16:17
ben il est complet :
     if ($to && $to ne "" && $status =~ m/(valeur1|valeur2|valeur3)/i ){
	   delete($tableau_to{$id});
     }
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 août 2010 à 16:22
Re,

Maintenant, oui il est complet.

$to && $to ne "" peut être écris tout simplement $to ne ""

Teste et affiche ça.

if ($to ne "" && $status =~ m/valeur1|valeur2|valeur3/i ){
  print "$to - $status\n";
}
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
26 août 2010 à 16:28
alors là je dois dire que je ne pense pas ... si je test uniquement avec $to ne "" j'ai :
Use of uninitialized value in string ne

si j'ajoute un test sur $to ça passe ...
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
26 août 2010 à 16:24
j'ai fais l'inverse :
if ($to && $to ne "") {
			if ($status =~ m/(valeur1|valeur2|valeur3)/i ){
				delete($tableau_to{$id});
			}
		}


et j'ai la même erreur sur la ligne :
if ($status =~ m/(expired|bounced|sent)/i ){


Use of uninitialized value in pattern match (m//)

j'ajoute que c'est une erreur qui se reproduit à plusieurs endroit de mon code comme par exemple :


($info1,$info2,$info3)=$tmp_from=~/([^_|\n]*)?_?([^_|\n]*)?_?([^_|\n]*)?$/o;

PS :j'aurais pu utiliser split pour celle là :)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
Modifié par lami20j le 26/08/2010 à 16:26
Re,

Mais $id c'est quoi?
Test ton if avec des print puisque ce n'est pas forcement que l'erreur vienne de la condition if

Test ça

if ($to ne "" && $status =~ m/valeur1|valeur2|valeur3/i ){
  print "$to - $status - $id\n";
}
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 août 2010 à 16:26
Re,

Tu n'est pas dans une boucle while par hasard?
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
Modifié par sbouli le 26/08/2010 à 16:31
eu si ... je lis un fichier ligne à ligne ....

pour répondre à ta question sur le $id il vient de plus haut (plusieurs endroit possible) et juste avant le if en question j'ai cette ligne :

$to = $tableau_to{$id};
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
26 août 2010 à 16:31
Re,

Ben, affiche ta boucle entière pour voir.

Sinon pour ne et "" regarde un test
$ perl -e 'print $n if $n ne ""'
$ perl -e '$n="a"; print $n if $n ne ""'
a
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
26 août 2010 à 16:34
la boucle entière ça représente 90% du fichier et comme je dois "nettoyer" toutes informations personnelles aux internautes ... ça me prend un temps certains ...
si tu le souhaites, je te mail le script, un fichier de log de test pour que tu vois ....

Stéphane
0