#!/usr/bin/perl -W # TP texte en perl # # Question II - 2 # # Antoine Miné # 26/01/2007 # penser à faire "export COMLUMNS" avant de lancer le script! # si COLUMNS n'est pas défini, on utilise 80 par défaut $cols = $ENV{COLUMNS} || 80; # lit les arguments while ($ARGV[0]) { if ($ARGV[0] eq "-c") { shift; # décale un tableau, @ARGV par défaut $cols = $ARGV[0]; } else { push @files,$ARGV[0]; } shift; # décale @ARGV par défaut } # si pas de fichier, on prend l'entrée standard if ($#files<0) { @files=("-"); } $vide=1; # la dernière ligne était-elle vide ? $par=""; # accumulateur de paragraphe # boucle principale for $FILE (@files) { # version courte d'open: ouvre $FILE dans FILE open (FILE) or die "$FILE: $!"; while () { if (/^\s*$/) { # fin de pagraphe ¶graphe; $par=""; } else { # accumule la ligne dans le paragraphe $vide=0; $par="$par $_"; } } # affiche le dernier paragraphe ¶graphe; close FILE } # découpe $par en lignes sub paragraphe { $_ = $par; return if /^\s*$/; # saute un paragraphe vide s/^\s*//g; # mange les espaces en début de ligne s/\s*$//g; # mange les espaces en fin de ligne s/\s*([)\]])/$1 /g; # mange les espace avant ) ] et ajoute-en un après s/([(\[])\s*/ $1/g; # mange les espace après ( [ et ajoute-en un avant s/([;:!?])/ $1 /g; # ajoute un espace avant ; : ! ? s/\s*([.,])/$1 /g; # mange les espace avant , . et ajoute-en un après s/\s+/ /g; # mange les espaces multiples $pos=0; # colonne courante foreach (split) { if ($pos+length>=$cols-2) { # plus de place sur la ligne, on passe à la suivante print "\n"; $pos=0; } elsif ($pos>0) { print " "; } print "$_"; $pos += 1+length; } print "\n\n"; }