Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Script Perl - Besoin d'aide
Envoyé par: julfra

Bonjour,

Je suis novice en Perl et j aimerais utiliser un script Perl qui me permettrais de lire un fichier texte et d'écrire sur la sortie standard chaque enregistrement du fichier.
Le fichier texte est sous cette forme :
<debut>enregistrement</fin>
<debut>enregistrement</fin>
....


Merci d avance pour votre aide

Poste le Thursday 13 May 2004 08:21:44
Répondre     Citer    
Re: Script Perl - Besoin d'aide
Envoyé par: fabrice d

Si on utilise du XML, l'écriture devra plutôt être du type :
<rec>enregistrement 1</rec>
<rec>enregistrement 2</rec>

Pour parser du XML le plus sûr est d'utiliser des modules DOM ou SAX.
(disponibles sur CPAN.org).

Sinon pour un cas simple un petit script simple :
#!/usr/bin/perl -w
#
#usage : monscript.pl monfichier.txt
#
use strict;
open(FICHIER, '<', shift(@ARGV)) || die;
while (<FICHIER>)
{
print "$1\n" if (/.*<rec>(.*)<\/rec>.*/);
# pour conserver des balises <début> ... </fin>
# remplacer par la ligne :
# print "$1\n" if (/.*<debut>(.*)<\/fin>.*/);
}

Poste le Thursday 13 May 2004 16:37:34
Répondre     Citer    
Re: Script Perl - Besoin d'aide
Envoyé par: pierre jaillet

Il y a aussi l'opérateur .. que l'on oublie souvent et qui simplifie énormément la vie. C'est de la magie perl, comme diraient les gouroux perlistes !

open ( FICHIER)
while (<FICHIER>){
if ( !<debut>! .. !</fin>! ) {
#ici on fait ce que l'on veut
}
}

#la ligne du texte est comprise entre <debut> et <fin> inclus, ce pourrait être d'autres motifs
Il ne te reste qu'à enlever <debut> au début et <fin> à la fin si nécessaire

pour plus de détails voir les opérateurs .. et ... dans la section Range Operator de perlop dans la doc perl

Pierre

Poste le Wednesday 11 August 2004 19:43:43
Répondre     Citer    
Re: Script Perl - Besoin d'aide
Envoyé par: pierre jaillet

Précision: l'opérateur .. se fiche de savoir si ton enregistrement est sur plusieurs lignes. Il cherchera toujours entre motif de début et motif de fin.

La solution
print "$1\n" if (/.*<rec>(.*)<\/rec>.*/); peut poser des problèmes: .* match avec tout entre la première balise <rec> rencontré et la dernière </rec> ce qui ne convient pas dans le cas où tu n'es pas certain d'avoir un enregistrement et un seul par ligne
par exemple s!<code>.*</code>!!gsi transforme la phrase "même l'éditeur <code>vi</code>peut éditer du <code>troff</code>de manière efficace" en "même de manière efficace". Ce qui ne va pas. (in perl en action)
* est un opérateur "glouton", il vaudrait mieux écrire:
print "$1\n" if (/<rec>(.*?)<\/rec>/);
c'est mieux mais il y a encore des risques

mais dans ton cas personnellement je préfèrerais utiliser l'opérateur ".." plus sûre, plus simple.

pierre

Poste le Wednesday 11 August 2004 20:11:08
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Script Perl - Besoin d'aide
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons