OVH Cloud OVH Cloud

Problème de pattern ?

2 réponses
Avatar
Emmanuel
Bonjour à tous,

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é

2 réponses

Avatar
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/

Avatar
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