[PERL] expression reg again ...

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

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    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
    1. ben il est complet :
           if ($to && $to ne "" && $status =~ m/(valeur1|valeur2|valeur3)/i ){
      	   delete($tableau_to{$id});
           }
      
      1. Modérateur
        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";
        }
      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 ...
    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à :)
      1. Modérateur
        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";
        }
      2. Modérateur
        Re,

        Tu n'est pas dans une boucle while par hasard?
      3. 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};
      4. Modérateur
        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
      5. 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