[PERL] expression reg again ...

sbouli Messages postés 208 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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

4 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Affiche ton if complet.
    0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  3. sbouli Messages postés 208 Statut Membre 2
     
    ben il est complet :
         if ($to && $to ne "" && $status =~ m/(valeur1|valeur2|valeur3)/i ){
    	   delete($tableau_to{$id});
         }
    
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
    2. sbouli Messages postés 208 Statut Membre 2
       
      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
  4. sbouli Messages postés 208 Statut Membre 2
     
    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
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
    2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Re,

      Tu n'est pas dans une boucle while par hasard?
      0
    3. sbouli Messages postés 208 Statut Membre 2
       
      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
    4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      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
    5. sbouli Messages postés 208 Statut Membre 2
       
      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