Code :
#!/usr/bin/perl use strict; use warnings; use autodie; my @block; open my $fhin, "<", "lines.txt"; open my $fhout, ">", "lines1.txt"; while (<$fhin> ) { my (@nom, @adresse, @ville); # si on a lu quatre lignes if (@block == 4 || eof) { # si le contenu a le bon pattern on range les 3 valeurs dans un tableau ad-hoc (ici @nom) if (defined($block[0]) && ($block[0] =~ /^ (. {37})\ s{7}(. {37})\ s{7}(. {37})\ s*$/ )) { map {s/^\ s+|\ s+$//g } @nom; # vire les blancs en trop autour le cas échéant } else { die "ligne de noms incorrecte: $block[0]!"; } if (defined($block[1]) && ($block[1] =~ /^ (. {37})\ s{7}(. {37})\ s{7}(. {37})\ s*$/ )) { push @adresse, $ 1, $ 2, $ 3; map {s/^\ s+|\ s+$//g } @adresse; } else { die "ligne d'adresse incorrecte: $block[1]!"; } if (defined($block[2]) && ($block[2] =~ /^ (. {37})\ s{7}(. {37})\ s{7}(. {37})\ s*$/ )) { } else { die "ligne de ville incorrecte: $block[2]!"; } if (defined($block[3]) && ($block[3] !~ /^\ s*$/ )) { die "ligne de separation incorrecte: $block[3]!"; } # on imprime maintenant dans l'ordre voulu foreach my $i (0..2) { print $fhout "$nom[$i];$adresse[$i];$ville[$i]\n"; } # raz pour traiter le prochain groupe de 4 lignes @block = (); } }
|