Lire un paragraphe [PERL] - Perl - Programmation
Marsh Posté le 29-06-2012 à 11:13:51
J'ai du mal à comprendre la nécessité d'avoir une variable par ligne trouvée Pourquoi pas un tableau? C'est quand même plus facile à traiter par la suite, non?
Marsh Posté le 29-06-2012 à 11:25:31
Citation : Le but du jeu c'est de commencer à remplir un tableau à partir du pattern #[REFRESH] jusqu'à la prochaine ligne vide. |
C'est une technique de base:
Code :
|
On positionne un flag qui indique si on doit imprimer la ligne lue en sortie ou non.
On met le flag a zéro au départ,
on met le flag a 1 si on trouve le pattern $outputflag = ... || (/$pattern/);
on remet le flag a 0 s'il est a 1 et qu'on trouve une ligne vide $outputflag = ($outputflag && (/\S/)) ... ;
Et on met le tout sur une seule ligne pour avoir une évaluation relativement optimisée: $outputflag = ($outputflag && (/\S/)) || (/$pattern/);
Note: on peut gagner un peu si l'on est certain de ne rencontrer qu'une seule fois une zone intéressante par fichier, en arrêtant la lecture du fichier après avoir rencontré la fin du bloc de lignes à traiter.
A+,
Marsh Posté le 29-06-2012 à 11:59:48
rufo a écrit : J'ai du mal à comprendre la nécessité d'avoir une variable par ligne trouvée Pourquoi pas un tableau? C'est quand même plus facile à traiter par la suite, non? |
C'est clair que ça devrait être un tableau de hashes.
A+,
Marsh Posté le 29-06-2012 à 12:23:46
Messieurs,
@Rafo : Je ne comprends pas ce qui te gène. Je récupére ce fichier, que je stock dans un tableau, je parcours et je veux juste récupérer les champs.
@gilou : Merci pour ta réponse. Nickel chrome .
Pour info j'ai 2 autres pattern mais bon avec ton exemple, je peux me débrouiller.
Je pense créer deux autres boucles. tu en penses quoi ?
un truc comme ça
my $REFRESHpattern = qr/^#\[REFRESH\]/;
my $ZDBpattern = qr/^#\[ZDB\]\s*$/;
my $BCpattern = qr/^#\[BC\]\s*$/;
Puis ce bout de code répété 3 fois (je remplace pattern par la bonne variable ;-))
foreach (@lines){
$outputflag = ($outputflag && (/\S/)) || (/$pattern/);
print if ($outputflag);
Marsh Posté le 29-06-2012 à 12:57:46
Tu peux aussi faire
my $pattern = qr/^#\[(REFRESH|ZDB|BC)\]\s*$/;
A+,
Marsh Posté le 29-06-2012 à 13:08:35
grulles a écrit : Messieurs, |
En relisant ton 1er post, je m'aperçois que j'avais pas bien compris. Moi, j'avais compris que tu voulais une variable par ligne alors qu'en fait, tu voulais, une variable pour chaque champ qui compose la ligne en cours de lecture. Cela dit, tu peux tout à fait rester sur un tableau associatif, une ligne dans le tableau = une ligne de ton fichier et tu associe à chaque ligne de ton tableau, un autre tableau dont les données correspondent à tes champs de la ligne
Ex :
Code :
|
Marsh Posté le 29-06-2012 à 13:59:26
gilou a écrit : C'est clair que ça devrait être un tableau de hashes. |
Exemple:
Code :
|
C:\Perl>perl pat.pl |
ou $VAR1 est $ligne[0], etc.
A+,
Marsh Posté le 29-06-2012 à 09:46:11
Bonjour,
Je commence tout juste à programmer en perl et j'aurais besoin d'aide pour lire un fichier a partir d'un pattern jusqu'à la prochaine ligne vide.
Voici mon fichier
HORCM_MON
#ip_address service poll(10ms) timeout(10ms)
Servername 10000 1000 3000
HORCM_CMD
#dev_name dev_name dev_name
/dev/rdisk/disk4
HORCM_LDEV
#dev_group dev_name Serial# CU:LDEV(LDEV#) MU#
#[REFRESH]
oradata3 oradata3_001 78741 ce:ec 0
oradata3 oradata3_002 78741 ce:ed 0
oradata3 oradata3_003 78741 ce:ee 0
oradata3 oradata3_004 78741 ce:ef 0
oralog3 oralog3_001 78741 ce:f0 0
HORCM_INST
#dev_group ip_address service
oradata3 servername 10000
oralog3 servername 10000
Le but du jeu c'est de commencer à remplir un tableau à partir du pattern #[REFRESH] jusqu'à la prochaine ligne vide. CAD, récupérer uniquement ces infos :
#[REFRESH]
oradata3 oradata3_001 78741 ce:ec 0
oradata3 oradata3_002 78741 ce:ed 0
oradata3 oradata3_003 78741 ce:ee 0
oradata3 oradata3_004 78741 ce:ef 0
oralog3 oralog3_001 78741 ce:f0 0
J'arrive bien a stocké mon fichier dans un tableau @lines() le parcourir et match mon pattern par contre apres je suis perdu.
Le top aussi c'est de conserver dans un variable distinct chaque champ
ie : $1 = oradata3
$2 = oradata3_001
etc etc et j'en passe et des meilleurs....
foreach (@lines) {
if ($_ =~ /#\[\w+\]/) {
.......
}
....
}
Merci pour votre aide.
Grulles