Les formats d'impression.

L'impression des données.

Nous avons vu comment il était possible de présenter simplement ders résultats sur l'écran.
Pour les véritables adeptes de C, Perl propose l'instruction printf qui fonctionne exactement comme en C.

Programme form1.pl Exécution sur l'écran
#!/usr/bin/perl;
$v=10;
printf ("Valeur de v : %d.\n", $v);
    
c:\progs> perl form1.plent
    Valeur de v : 10.
c:\progs>
    

Les champs de l'instruction printf ont les même signification que en C.

Champ. Signification.
%c Un caractère isolé.
%d Un entier en base 10.
%e Un nombre flotant en notation scientifique.
%f Un nombre flotant en notation normale.
%g Un nombre flotant en format compact.
%o Un entiier en base 8
%s Une chaine de caractères.
%u Un entier non signé.
%x Un entier en base 16.

Perl étant aussi un langage d'édition, (repport language), dispose pour réaliser cette fonction d'affichage, de facilités de présentation supplémentaires. Ce sont les formats.

L'utilisation de la notion de format nécessite trois opérations :

1 - Assignation du format à la variable système $~ ce qui en autorisera l'interprétation.

2 - Positionnement de l'information à imprimer dans les emplacements prévus du format.

3 - Appel du format.

Généralement, la première étape est faite une fois pour toute dans le texte du programme. La seule contrainte est qu'elle soit définie au moment de la compilation.
Les étapes 2 et 3 sont des fonctions répétitives.

@format NOM_DU_FORMAT =
definition_de_champ
valeur_1,valeur_2
definition_de_champ
valeur_1,valeur_2
definition_de_champ
valeur_1,valeur_2
.
  

Le mot 'format' est un mot réservé, il est suivi du nom que l'on affecte au format en question, l'ensemble est suivi du signe "=" (égal).
Une définition de format doit impérativement se termine par une ligne contenant un point suivi d'un retour chariot.

Prenons le fichier suivant :

Christian Aperghis Marseille France
Ivan Momchev Sofia Bulgarie
Ivan Madjarov Sofia Bulgarie
Bogdan Shishedjiev Sofia Bulgarie
Jacques Guizol Plan-de-Cuques France
  

Il contient des données (une par ligne) représentant le prénom, le nom, la ville et le pays relatifs à un individu.

On désire procéder à une édition de ces données sous forme d'étiquette selon le suivant

+----------------------------+
| Prenom                     |
| Nom                        |
|            Ville           |
|                      Pays  |
+----------------------------+
   
Programme form2.pl Exécution sur l'écran
#!/usr/bin/perl;
@ARGV =("Etiq.txt");
$~="ETIQUETTE";
while  ($ligne = <>) {
  chop ($ligne);
  ($pre,$nom,$ville,$pays) = split(/ /,$l);
  write;
}

format ETIQUETTE =
+----------------------------+
| @<<<<<<<<<<<<<<<<<<<<<     |
$pre
| @<<<<<<<<<<<<<<<<<<<<<     |
$nom
|    @|||||||||||||||||||||  |
$ville
|    @>>>>>>>>>>>>>>>>>>>>>  |
$pays
+----------------------------+
.
      
c:\progs> perl form2.plent
+----------------------------+
| Christian                  |
| Aperghis                   |
|          Marseille         |
|                    France  |
+----------------------------+
+----------------------------+
| Ivan                       |
| Momchev                    |
|            Sofia           |
|                  Bulgarie  |
+----------------------------+
+----------------------------+
| Ivan                       |
| Madjarov                   |
|            Sofia           |
|                  Bulgarie  |
+----------------------------+
+----------------------------+
| Bogdan                     |
| Shishedjiev                |
|            Sofia           |
|                  Bulgarie  |
+----------------------------+
+----------------------------+
| Jacques                    |
| Guizol                     |
|        Plan-de-Cuques      |
|                    France  |
+----------------------------+
c:\progs>

Les champs d'affichage des formats ont les significations suivantes :

Champ. Signification.
@<<<<< >Champ texte cadré à gauche.
@>>>>> Champ texte cadré à droite.
@||||| Champ texte centré.
@###.## Affichage de nombre flotant.
@* Texte sur plusieurs lignes

Voyons un autre exemple un peu plus compliqué.
En reprenant le fichier Poeme.txt, on désitre compter le nombre de voyelles apparaissant dans le texte et afficher un tableau indiquant clairement combien de fois chacune d'elle est présente.

Programme form3.pl Exécution sur l'écran
#!/usr/bin/perl;
@ARGV =("Poeme.txt");
while  ($ligne = <>) {
  $ligne=~s/[^aeiou]//g;
  @voyelles = split(//,$ligne);
  foreach $voyelle (@voyelles) {
    $c{$voyelle} +=1;
  }
}
$~= "AFFICHAGE";
write;

format AFFICHAGE =
+=========================================+
|     Nombre de voyelles dans le texte    |
+-----------------------------------------+
|  a   |  e   |  i   |  o   |  u   |  y   |
+------+------+------+------+------+------+
|@###  |@###  |@###  |@###  |@###  |@###  |
$c{"a"},$c{"e"},$c{"i"},$c{"o"},$c{"u"},$c{"y"}
+======+======+======+======+======+======+
c:\progs> perl form3.plent
+=========================================+
|     Nombre de voyelles dans le texte    |
+-----------------------------------------+
|  a   |  e   |  i   |  o   |  u   |  y   |
+------+------+------+------+------+------+
|  42  |  88  |  32  |  27  |  31  |   0  |
+======+======+======+======+======+======+
c:\progs>

Les tubes.

Nous reparlerons en détail de cette notion de tubes lorsque nous aborderons le chapitre sur l'interface Perl / Unix. Pour l'instant, il suffit de savoir que dans un environnement Unix, il est possible de récupérer, via un tube, le résultat d'une commande dans un fichier et de l'utiliser comme fichier d'entrée. Cette particularité nous permet de formater certaines données afin d'améliorer leur présentation.
Voyons tout d'abord la récupération du résultat de la commande

"cat Poeme.txt|"

Qui permet de lister le contenu d'un fichier. Le signe | (pipe) qui se trouve en fin de commande indique qu'il s'agit d'un tube et que le résultat de l'exécution de la commande en question pourra être considére comme un fichier dont le descripteur sera référencé. par exemple, nous l'appellerons "FICH1".
Chaque accés au descripteur <FICH1> permettra d'accéder à la ligne syuivante générée par l'exécution de la commande en question.

Voyonc ceci sur un exemple.

c:\progs> type form4.plent
#!usr/bin/perl
open (FICH1, "cat Poeme.txt|");
$compteur = 1;
$ligne = <FICH1>;
chop ($ligne);
while ($ligne ne "") {
  $~ = "LIGNE";
  write;
  $compteur++;
  $ligne = <FICH1>;
  chop ($ligne);
}
$compteur--;
print ("\nLe nombre total de lignes est de : $compteur.\n");
format LIGNE =
<@>> > @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $compteur, $ligne . c:\progs> perl form4.plent < 1 > Terre, ouvre-moi ton sein, et me laisse reprendre < 2 > Mon tresor, que ta parque a cache dessous toi; < 3 > Ou bien, si tu ne peux, o terre, cache moi < 4 > Sous meme sepulture, avec sa belle cendre. < 5 > < 6 > Le trait qui la tua devait faire descendre < 7 > Mon corps aupres du sien pour finir mon emoi; < 8 > Aussi bien, vu le mal qu'en sa mort je recoit, < 9 > Je ne saurais plus vivre, et me fache d'attendre. < 10 > < 11 > Quand ses yeux m'eclairaient, et qu'en terre j'avais < 12 > Le bonheur de les voir, a l'heure je vivais, < 13 > Ayant de leurs rayons mon ame gouvernee. < 14 > < 15 > Maintenant je suis mort : la Mort qui s'en alla < 16 > Loger dedans ses yeux, en parlant m'appela, < 17 > Et me fit de ses pieds accomplir ma journee. Le nombre total de lignes est de : 17 c:\progs>

Pour terminer, voyons une commande un peu plus évoluée et une compilation des résultats fournis par cette commande selon un format de présentation clair.
La commande unix "w" permet de lister les usagers de la machine sous le format suivant :

3:35pm  up 77 day(s),  7:14,  14 users,  load average: 4.79, 4.14, 4.12
User     tty           login@  idle   JCPU   PCPU  what
redondo  pts/0         2:14pm         2:56      2  /usr/bin/../java/bin/../bin/spar
chris    pts/10        2:37pm     1      1         w
malzac9j pts/22        3:07pm    24                oracleDBdess (DESCRIPTION=(LOCAL
dormoy9s pts/25        2:39pm     8      1      1  oracleDBdess (DESCRIPTION=(LOCAL
bosqui9v pts/8        11:37am     8      1      1  oracleDBdess (DESCRIPTION=(LOCAL
oulmoh9l dtremote      2:16pm     3                olwmslave
bernard  dtremote      2:17pm     3     16      3  dtwm
augier9l pts/9         3:02pm    17      1      1  oracleDBdess (DESCRIPTION=(LOCAL
massat   pts/7         3:30pm     3     36
augier9l pts/15        3:04pm    24      2         -sh
malzac9j pts/26        3:15pm    18                oracleDBdess (DESCRIPTION=(LOCAL
berkan9a pts/27        3:16pm     6      1      1  oracleDBdess (DESCRIPTION=(LOCAL
malzac9j pts/3         3:24pm                      oracleDBdess (DESCRIPTION=(LOCAL
malzac9j pts/13        3:07pm    24                telnet big
malzac9j pts/1         3:23pm            2      2  telnet big
bernard  pts/20        2:22pm    32   2:21   1:33  netscape
oulmoh9l pts/21        2:40pm    53                ftp big
malzac9j pts/24        3:14pm    18                telnet big
oulmoh9l pts/18        2:17pm    55                ftp big
malzac9j dtremote      3:22pm     3      1      1  dtwm

On désire analyser ces résultats en écrivant un programme perl qui donne la liste des noms de logins des divers utilisateurs de la machine classés par ordre alphabétique et pour chacun d'entre eux, le nombre de process qu'ils ont ouvert.

Programme form5.pl Exécution sur l'écran
#!/usr/bin/perl;
open (W, "w|");
$compteur = 1;
$heure = <W>;
$heure =~s/^ *//;
$heure =~s/ .*\n//;
print ("Il est actuellement $heure.\n\n");
print ("Usager    Processus\n\n");
<W>;
$ligne = <W>;
$ligne =~s/^ *//;
$ligne =~s/ .*\n//;
while ($ligne ne "") {
  $liste{$ligne} +=1;
  $ligne = <W>;
  $ligne =~s/^ *//;
  $ligne =~s/ .*\n//;
}
$nbut = 0;
$nbproc = 0;
foreach $nom (sort(keys(%liste))) {
  $nbut ++;
  $nbproc += $liste{$nom};
  $~="LISTENOMS";
  write;
}
print ("\nActuellement $nbproc processus;\n");
print ("Appartenant a $nbut utilisateurs.\n");

format LISTENOMS =
@<<<<<<<<<<<  @###
$nom, $liste{$nom}
.
    
c:\progs> perl form5.plent
Il est actuellement 4:45pm.

Usager    Processus

berkan9a         1
bernard          2
chris            1
dormoy9s         1
elbechir         1
malzac9j        11

Actuellement 17 processus;
Appartenant a 6 utilisateurs.
c:\progs>

Précédent
Suivant