Bonjour,

J'ai un fichier texte qui contient des log.
Ces log sont ordonnés par bloc avec un pattern de départ et un caractère de fin. Ci dessous un exemple:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
SEV="CRITICAL":EVTTIME="2011/02/23 04:34:35":FRDNAME="H37":EVTTYPE="EQUIPMENT":PBCAUSE="Ouput Device Error - X733":RSVSTS="NRSV":CLRSTS="CLR":ACKSTS="ACK":ARCHIVETIME="2011/02/23 04:45:05":ARCHIVECAUSE="Ack And Clear":ADDTEXT="$$$ *N=3479/STA/11-02-23/04-34-35/H37         /REPORT NOT AVAILABLE/
    +/H37     /R=01003/HLT1    /
    +/S/D/B A/ES_ESRE/              
 
";
SEV="CRITICAL":EVTTIME="2011/02/23 04:31:22":FRDNAME="H37":EVTTYPE="EQUIPMENT":PBCAUSE="Ouput Device Error - X733":RSVSTS="NRSV":CLRSTS="CLR":ACKSTS="ACK":ARCHIVETIME="2011/02/23 04:45:05":ARCHIVECAUSE="Ack And Clear":ADDTEXT="$$$ *N=3478/STA/11-02-23/04-31-22/H37         /REPORT NOT AVAILABLE/
    +/H37     /R=01003/HLT1    /
    +/S/D/B A/ES_ESRE/              
 
";
j'ai réalisé ce programme qui dans un premier temps extrait le bloc qui commence par le pattern "SEV=" et se termine par un ";"
ce bloc est donc une chaîne mais qui contient des retours chariot que je souhaite garder.


ensuite j'ai fait une fonction qui doit extraire ce qui est contenu dans:
ADDTEXT="..........":

mais la partie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
($alarme_texte) = $alarme =~ /ADDTEXT=\"(.*)\"/;
ne fonctionne pas.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/perl
 
use strict;
use warnings;
 
my $log = $ARGV[0];
 
# Définition des variables
my $ligne;               # La ligne courante du fichier en lecture
my $entree;              # String contenant toutes les infos sur les alarmes
my $continue = 0;
 
my $pattern_begin   = "^SEV=";
my $pattern_fin     = ";\$";
 
# ouverture du fichier en lecture
open(FILE, "<$log") or die $!;
 
# On boucle sur tout le fichier (tant qu'il y a une ligne à lire...)
while ($ligne = <FILE>)
{
  # Si la ligne commande par IMSI et que la variable start = 1
  if ( $ligne =~ m/$pattern_begin/ )
  {
      $entree = $ligne;
      $continue = 1;
  }
  elsif ( $continue = 1 && $ligne !~ m/$pattern_fin/ )
  {
      $entree = $entree.$ligne;
  }
  elsif  ( $ligne =~ m/$pattern_fin/ )
  {
      $entree = $entree.$ligne;
      $continue = 0;
      # Affiche le bloc extrait
      print $entree."\n\n";
 
      #affiche juste le texte de l'alarme
      &print_alarme_texte($entree);
  }
}
 
sub print_alarme_texte
{
    my $alarme = $_[0];
    my $alarme_texte = "";
    ($alarme_texte) = $alarme =~ /ADDTEXT=\"(.*)\"/;
    print $alarme_texte."\n\n";
}