J'ai écrit un petit script qui doit servir à faire le tri dans
l'information d'un fichier de log (log Oracle en l'occurence). Je charge
une blacklist dans une liste @hidden, puis je lis le fichier bloc à bloc
en éliminant les blocs contenant au moins un des patterns (des mots
bêtes et méchants) de la blacklist. Je précise aussi qu'un bloc est un
ensemble de lignes contigües, chaque bloc étant séparé par une ou
plusieurs lignes vides.
Cependant certains mots de la blacklist ne semblent pas "fonctionner".
En les rentrant en dur dans le block du grep, ils sont pourtant bien
éliminés du fichier résultat... Je ne sais pas trop quoi penser ni
surtout dans quelle direction orienter mes recherches. Je pensais à un
problème de locale, mais j'avoue mon incompétence.
Si vous avez une idée, je suis preneur. Je précise que le script doit
tourner avec perl 5.0 et que je suis (sigh) sous Windows 2000.
Merci beaucoup
Voici le script :
use strict;
use warnings;
use locale;
# Chargement de la liste des mots en évinçant les commentaires
open BL, 'blacklist.txt';
my @hidden = grep { !/^#|^$/ } <BL>;
close BL;
# Travail préalable sur la liste
# Remplacement des retours lignes par des OR
map { s/\r?\n?$/|/ } @hidden;
# Evincement du dernier OR
$hidden[@hidden-1] =~ s/\|$//;
# Ouverture du fichier de log et traitement
open FH, 'mig.log';
{
local $/ = ''; # Lecture par bloc
print grep { !/@hidden/ } <FH>;
}
close FH;
Voici la blacklist:
# Liste des mots à évincer
créé
effectuée
modifié
terminée avec succès
à jour
supprimée
8.1.7
Connecté à
Oracle
ORA-00001 <--- type de pattern posant problème
Exemple de bloc qui pose problème :
INSERT INTO g_droits_ressources
*
ERREUR Ó la ligne 1 :
ORA-00001: violation de contrainte unique (PL.PK_G_DROITS_RES)
^
On retrouve le pattern ici, mais à moins de le spécifier en dur, il
n'est pas matché
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jacques Caron
Salut,
On Wed, 08 Mar 2006 11:02:31 +0100, Emmanuel wrote:
use strict; use warnings; use locale;
En as tu vraiment besoin?
# Chargement de la liste des mots en évinçant les commentaires open BL, 'blacklist.txt'; my @hidden = grep { !/^#|^$/ } <BL>; close BL;
# Travail préalable sur la liste # Remplacement des retours lignes par des OR map { s/r?n?$/|/ } @hidden; # Evincement du dernier OR $hidden[@hidden-1] =~ s/|$//;
Moi je ferais: for (@hidden) { s/r?n?$// } my $pattern = join '|',@hidden; print STDERR "pattern=".$pattern."n"; my $re = qr/$pattern/;
# Ouverture du fichier de log et traitement open FH, 'mig.log'; { local $/ = ''; # Lecture par bloc print grep { !/@hidden/ } <FH>;
Et là print grep {!/$re/} <FH>;
} close FH;
Voici la blacklist: [...]
ORA-00001 <--- type de pattern posant problème
Exemple de bloc qui pose problème :
INSERT INTO g_droits_ressources * ERREUR Ó la ligne 1 : ORA-00001: violation de contrainte unique (PL.PK_G_DROITS_RES) ^ On retrouve le pattern ici, mais à moins de le spécifier en dur, il n'est pas matché
Je ne vois pas a priori de bonne raison, mais le code ci-dessus te permettra déjà de vérifier que ton pattern correspond effectivement à ce que tu veux.
Jacques. -- Oxado http://www.oxado.com/
Salut,
On Wed, 08 Mar 2006 11:02:31 +0100, Emmanuel <mars@tacks.com> wrote:
use strict;
use warnings;
use locale;
En as tu vraiment besoin?
# Chargement de la liste des mots en évinçant les commentaires
open BL, 'blacklist.txt';
my @hidden = grep { !/^#|^$/ } <BL>;
close BL;
# Travail préalable sur la liste
# Remplacement des retours lignes par des OR
map { s/r?n?$/|/ } @hidden;
# Evincement du dernier OR
$hidden[@hidden-1] =~ s/|$//;
Moi je ferais:
for (@hidden) { s/r?n?$// }
my $pattern = join '|',@hidden;
print STDERR "pattern=".$pattern."n";
my $re = qr/$pattern/;
# Ouverture du fichier de log et traitement
open FH, 'mig.log';
{
local $/ = ''; # Lecture par bloc
print grep { !/@hidden/ } <FH>;
Et là print grep {!/$re/} <FH>;
}
close FH;
Voici la blacklist:
[...]
ORA-00001 <--- type de pattern posant problème
Exemple de bloc qui pose problème :
INSERT INTO g_droits_ressources
*
ERREUR Ó la ligne 1 :
ORA-00001: violation de contrainte unique (PL.PK_G_DROITS_RES)
^
On retrouve le pattern ici, mais à moins de le spécifier en dur, il
n'est pas matché
Je ne vois pas a priori de bonne raison, mais le code ci-dessus te
permettra déjà de vérifier que ton pattern correspond effectivement à ce
que tu veux.
On Wed, 08 Mar 2006 11:02:31 +0100, Emmanuel wrote:
use strict; use warnings; use locale;
En as tu vraiment besoin?
# Chargement de la liste des mots en évinçant les commentaires open BL, 'blacklist.txt'; my @hidden = grep { !/^#|^$/ } <BL>; close BL;
# Travail préalable sur la liste # Remplacement des retours lignes par des OR map { s/r?n?$/|/ } @hidden; # Evincement du dernier OR $hidden[@hidden-1] =~ s/|$//;
Moi je ferais: for (@hidden) { s/r?n?$// } my $pattern = join '|',@hidden; print STDERR "pattern=".$pattern."n"; my $re = qr/$pattern/;
# Ouverture du fichier de log et traitement open FH, 'mig.log'; { local $/ = ''; # Lecture par bloc print grep { !/@hidden/ } <FH>;
Et là print grep {!/$re/} <FH>;
} close FH;
Voici la blacklist: [...]
ORA-00001 <--- type de pattern posant problème
Exemple de bloc qui pose problème :
INSERT INTO g_droits_ressources * ERREUR Ó la ligne 1 : ORA-00001: violation de contrainte unique (PL.PK_G_DROITS_RES) ^ On retrouve le pattern ici, mais à moins de le spécifier en dur, il n'est pas matché
Je ne vois pas a priori de bonne raison, mais le code ci-dessus te permettra déjà de vérifier que ton pattern correspond effectivement à ce que tu veux.
Jacques. -- Oxado http://www.oxado.com/
Emmanuel
Moi je ferais: for (@hidden) { s/r?n?$// } my $pattern = join '|',@hidden; print STDERR "pattern=".$pattern."n"; my $re = qr/$pattern/;
Cette méthode est beaucoup plus clean. A tel point que ça marche maintenant :) Je pense que la ligne qui change tout, c'est "my $re = qr/$pattern/;". Je ne suis pas encore bien familiarisé avec Perl, mais c'est le métier qui rentre.
Merci beaucoup en tout cas :)
Emmanuel
Moi je ferais:
for (@hidden) { s/r?n?$// }
my $pattern = join '|',@hidden;
print STDERR "pattern=".$pattern."n";
my $re = qr/$pattern/;
Cette méthode est beaucoup plus clean. A tel point que ça marche
maintenant :)
Je pense que la ligne qui change tout, c'est "my $re = qr/$pattern/;".
Je ne suis pas encore bien familiarisé avec Perl, mais c'est le métier
qui rentre.
Moi je ferais: for (@hidden) { s/r?n?$// } my $pattern = join '|',@hidden; print STDERR "pattern=".$pattern."n"; my $re = qr/$pattern/;
Cette méthode est beaucoup plus clean. A tel point que ça marche maintenant :) Je pense que la ligne qui change tout, c'est "my $re = qr/$pattern/;". Je ne suis pas encore bien familiarisé avec Perl, mais c'est le métier qui rentre.