Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 14/12/2012, 11h06   #1
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 511
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 511
Points : 32
Points : 32
Par défaut gestion des non erreurs dans un fichier

Bonjour,

Je souhaiterai réaliser un script qui m'ouvre un fichier dans le quel il y aurait différente ligne et ne récupérer que les lignes qui n'ont pas les mots suivants : erreur, error...

Pour cela, j'avais pensé aux programme suivant :

quel est la négation pour " =~ " ?

Citation:

open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";

my @GestionLigneExclu=("erreur","error");

while ($Ligne = <FIC_READ> )
{
if (grep { $Ligne =~ m/$_/g } @GestionLigneExclu)
{
print "traitement $Ligne \n";
}
else
{
print "erreur $Ligne \n";
}


}
close (FIC_READ);
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 11h39   #2
messinese
Membre chevronné
 
Homme Jean-marie Bourbon
IT Security Consultant
Inscription : septembre 2007
Messages : 338
Détails du profil
Informations personnelles :
Nom : Homme Jean-marie Bourbon
Âge : 31
Localisation : France, Aude (Languedoc Roussillon)

Informations professionnelles :
Activité : IT Security Consultant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2007
Messages : 338
Points : 681
Points : 681
Salut,

la négation pour ta regexp ( ne match pas ) est Cdlt.
messinese est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 14h05   #3
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 511
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 511
Points : 32
Points : 32
j'ai mis cela :

Citation:

open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";

my @GestionLigneExclu=("erreur","error");

while ($Ligne = <FIC_READ> )
{
if (grep { $Ligne =~ m/$_/g } @GestionLigneExclu)
{
print "traitement $Ligne \n";
}
else
{
print "erreur $Ligne \n";
}


}
close (FIC_READ);
malgré cela, les lignes contenant le mot erreur apparaissement dans la premier condition "Traitement $Ligne".

Merci pour votre aide
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 14h06   #4
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 511
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 511
Points : 32
Points : 32
pardon , je voulais dire :

open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";

my @GestionLigneExclu=("erreur","error");

while ($Ligne = <FIC_READ> )
{
if (grep { $Ligne !~ m/$_/g } @GestionLigneExclu)
{
print "traitement $Ligne \n";
}
else
{
print "erreur $Ligne \n";
}


}
close (FIC_READ);
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 14h12   #5
messinese
Membre chevronné
 
Homme Jean-marie Bourbon
IT Security Consultant
Inscription : septembre 2007
Messages : 338
Détails du profil
Informations personnelles :
Nom : Homme Jean-marie Bourbon
Âge : 31
Localisation : France, Aude (Languedoc Roussillon)

Informations professionnelles :
Activité : IT Security Consultant
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2007
Messages : 338
Points : 681
Points : 681
As tu essayer de printer dans ta boucle pour voir ce que ça donne comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
open (FIC_READ, "<$Fichier") || die "Ouverture impossible du fichier $Fichier: $!";
 
my @GestionLigneExclu=("erreur","error");
 
while ($Ligne = <FIC_READ> ) {
    if (grep { $Ligne !~ m/$_/g } @GestionLigneExclu){ 
        print "traitement $Ligne for : $_ \n";
}
else{
    print "erreur $Ligne \n";
}
 
 
} 
close (FIC_READ);
et puis la syntaxe utilisée j'avoue , j'en suis pas fan (passage de tableau à un grep comme ceci )
messinese est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 17h24   #6
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 572
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 572
Points : 1 124
Points : 1 124
Suppose que $Ligne contienne: "erreur toto titi", avec @GestionLigneExclu=("erreur","error");

Ton "grep { $Ligne !~ m/$_/g } @GestionLigneExclu) " va te renvoyer "error", puisque error n'est pas dans ta ligne. Du coup, en contexte scalaire, ce sera évalué à 1 (un élément retournée par le grep) et, par conséquent, le if considérera la condition comme étrant vraie.
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 10h57   #7
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 511
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 511
Points : 32
Points : 32
A partir du moment ou je mets cela dans un tableau, avec plusieurs valeurs, ça ne fonctionne pas.

La commande suivante ci-dessous fonctionne : par contre je ne peux mettre qu'une référece dans ma variable $toto.
Comment pourrais je avoir plusieures référence,

comme my $toto="erreur, fatal, ERROR";

Citation:
my $toto="erreur";
if ($Ligne !~ m/$toto/ ) {
print "on affiche la ligne\n";
}
else
{
print "on affiche rien\"n;
}


vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 13h14   #8
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 572
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 572
Points : 1 124
Points : 1 124
Si tu mets tes différents mots disgnostics d'erreur dans un tableau, par ex:

Code :
my @error_msg = qw /erreur error fatal failed coredump/;
tu n'as pas trop d'autre choix que de tester chacun des éléments du tableau sur chaque ligne. Par exemple quelque chose comme cela:

Code :
1
2
3
4
5
while (my $ligne = <$FIC_READ>) {
     foreach my $pattern (@error_msg) {
          print "erreur sur ligne $.\n" if $ligne =~ /$pattern/;
     }
}
Tu peux aussi faire un grep (positif, pas négatif, pour la raison exposée dans mon post précédent), ça te donnera l'impression de ne pas faire un truc aussi inefficace que deux boucles imbriquées, mais ça ne change pas grand chose à la réalité des choses (en sous-jacent, il y aura bien deux boucles impriquées). Pas testé, mais un truc comme cela devrait marcher à peu près, je pense:

Code :
1
2
3
while (my $ligne = <$FIC_READ>) {
           print "erreur sur ligne $.\n" if (grep { $ligne =~ /$_/} @error_msg);
}
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 15h02   #9
vince2005
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 511
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 511
Points : 32
Points : 32
en effet, ça fonctionne mieux.

Mais si dans ma variable, je fais une recherche sur des mots avec des espaces., ça ne fonctionne pas !!

my @error_msg = qw /erreur error fatal failed coredump/;

par exemple, je recherche "erreur du programme", je recherche la pharse entiere.

merci pour votre aide
vince2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 17h52   #10
Lolo78
Membre Expert
 
Homme Laurent R.
Conseil - Consultant en systèmes d'information
Inscription : mai 2012
Messages : 572
Détails du profil
Informations personnelles :
Nom : Homme Laurent R.
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2012
Messages : 572
Points : 1 124
Points : 1 124
Si tu recherches des expression contenant plusieurs mots, il faut remplacer la syntaxe qw:

Code :
my @error_msg = qw /erreur error fatal failed coredump/;
par celle-ci:

Code :
my @error_msg = ("fatal error", "erreur de lecture du fichier", "Programme arrêté par la fin du monde le 21/12/2012");
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.
Lolo78 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h58.


 
 
 
 
Partenaires

Hébergement Web