Code :
#!/usr/bin/perl #fichier blocksfile.pl use strict; use warnings; use autodie qw(open close); # open/close succeed or die my $filename = "blocksfile.txt"; #nom du fichier en entrée open my $fh, '<', $filename; my $savedprefix = "savedblock"; #préfixe des fichiers sauvés my $savedfh; my $inblock = 0; #flag pour savoir si la ligne est dans un bloc ouvert my $numblock = 0; # compte des débuts de blocs rencontrés while (<$fh> ) { if (/^. {6}\ s\d {2}\ s. {6}$/o ) { #pattern de ligne pour 6 caracteres, un blanc, deux chiffres, un blanc, 6 caracteres if ($inblock) { # on a trouvé un début alors qu'on est déja dans un bloc ouvert print "Warning: Block $numblock incorrectly closed:skipped\n"; unlink $savedprefix. $numblock. ".txt"; #on efface le fichier de bloc incorrect } # bon on est maintenant prêt a traiter le cas de rencontre d'un nouveau bloc $inblock = 1; # flag mis à 1 $numblock++; # cpteur incrémenté open $savedfh, '>', $savedprefix. $numblock. ".txt"; # on ouvre un nouveau fichier de block à sauver binmode $savedfh; # mode binaire à tout hasard, comme je ne connais pas tes données print $savedfh $_; # on écrit la ligne dans le fichier de block à sauver (pas clair si ca doit être fait dans ton cas) } elsif (/^nnnn$/) { if ($inblock) { # on a rencontré une fin de block pour un block ouvert print $savedfh $_; # on écrit la ligne dans le fichier de block à sauver (pas clair si ca doit être fait dans ton cas) close $savedfh; #on ferme le fichier $inblock = 0; #on positionne le flag a 0 } # et traitement en erreur sinon? } elsif ($inblock) { #ligne standard dans un bloc ouvert print $savedfh $_; # on écrit la ligne dans le fichier de block à sauver } } if ($inblock) { print "Warning: Block $numblock incorrectly closed:skipped\n"; unlink $savedprefix. $numblock. ".txt"; }
|