Vous trouverez sur cette page, le code du programme
"
taf
" (
Traducteur Français-Anglais
)
commenté mot par mot, ligne par ligne.
En suivant vous trouverez sur cette page:
Juste deux mots pour vous exposer ce que contient cette page (un peu longue). Elle contient un de mes script Perl, que j'ai appelé
Le but de cette page est de commenter mot à mot un script complet,
j'ai choisi mon script taf pour le faire. Si ce script vous intéresse (on peut faire
plein de trucs avec, style traducteur Espéranto-Klingon ou un dictionnaire des
synonymes) vous trouverai un version plus récente en fin de page.
Je vous souhaite de trouver votre bonheur dans ces pages, en bon brocanteur que j'ai
été et perliste débutant.
Soyez indulgents face aux fautes d'orthographe et si vous n'avez pas compris ou que vous
avez relevé des erreurs qui vous font bondir, keep cool, veuillez plutôt me
les signaler afin que j'y remédie.
Nous allons voir ligne par ligne comment se fabriquer un traducteur d'anglais-français, français-anglais évolutif (évolutif dans le sens que plus on l'utilisera plus il sera complet). Je l'ai appelé Tafed ( T raducteur A nglais F rançais ED itable)
Voyons voir sur Windows ou sur Linux ce qu'il nous faut:
Pour Windows un clic droit de la souris sur le bureau, puis Nouveau, puis document texte, OK
On ouvre ce document puis on écris dedans une ou deux ligne, comme ci-dessous sans espace :
first,premier
link,lien
load,charger,télécharger,attrape,comprendre
last,dernier,final|last time=la dernière fois
Voilà, le dico est fait, tout au moins il existe, on sauve en lui donnant
le nom de "dico_uk-fr" ou " dico_a-f.dico ".
Il nous faut aussi un programme qui ira voir, quel mot, dans
le dico, correspond à celui que l'on entre, et ceci en
Français ou en Anglais.
Voilà le topo, il ne nous reste plus qu'a faire ce programme. Fastoche isn't it?
Il va vous accueillir et vous demander ce que vous voulez faire dans un petit menu, style :
********************************************** Bonjour, ceci est le petit traducteur Tafed (Traducteur Anglais Français EDitable) Faite votre choix : Anglais-français [1], Français-Anglais [2], Editer, ajouter quelques définition [3], quitter [q ] **********************************************
Puis suivant votre réponse il ouvrira le dico et vous demandera d'entrer un mot ou une lettre
Puis il vérifiera les équivalences et vous présentera le résultat
comme ceci :
Si vous tapez last :
>last = dernier final (exemple.:last time = la dernière fois)
si vous tapez juste ‘l’ :
>last = dernier final
>link = lien
>load = charger
télécharger
attraper comprendre
et tout les autre mots commençant par l stocké dans votre db dico_uk-fr
Ceci est très pratique lorsqu'on ne se rappelle pas exactement de l'orthographe du mot.
Dans le cas ou vous choisissez d'éditer quelques mots supplémentaires, il vous dira comment les entrer, puis vérifiera si elle n'existe pas déjà dans le dico et vous demandera de confirmer après vous avoir monter l'équivalence qu'il à découverte comme ceci :
>Le mot link existe déjà dans le dico, sous cette forme : link = lien voulez vous le garder [Oui-Non] ?
Quand au Français-Anglais il va chercher dans toutes les traductions, sur tous les niveaux, la concordance.
Maintenant nous allons voir comment on va lui faire faire cela. Ligne par ligne mot par mot (ici).
Chaque ligne d'explication sera écrite_ _ _ _ _ _en grisé
Tous les numéro de ligne de code seront _ _ _ _ en Orangé
Tous les exemple de sortie écran seront _ _ _ _ _en violé
mais aussi toute chose importante _ _ _ _ _ _ en bleu
le code_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ code rouge sur orangé
certains termes sont expliqués plus en détail dans les renvois en fin de page comme:
variable
,
variable liste
,
variable hashage
, concaténation,
assignation
,
sous-procédure
,
boucle logiques
,
filehandle
,
menu
,
while
,
etc...
Tout programme ou script Perl commence par un Bang ou cheban . C'est une ligne qui va être reconnu par l'interpréteur du système que l'on utilise (MS DOS pour Windows, bash, ash, sh pour Linux).
Pour Linux il sera ainsi:
01 #!/usr/bin/perl -walors que pour Windows il sera comme ça:
01 #!perl -winfo :le petit " w " comme argument signifie que vous désirez voir écrit le compte rendu de l'interprétation du script passé au debuggage (très utile, il vous indique les erreur et la ligne ou l'erreur à était relevé).
récapitulation
la ligne 01 s'appelle le Bang, qui indique que ce script doit
être
interprété en Perl et commence par #!
puis le nom de l'interpréteur
("perl" sous windows) et (/usr/bin/perl sous Linux), l'argument -w signifie
"tenez moi au courant des erreurs"
02 #***************************************************************************la ligne 02 est en commentaire, une ligne pour faire joli, toute les lignes commençant par un dièse "#" son des commentaire au script. C'est à dire qu'elle ne seront pas interprétées lorsque nous exécuterons le script. (pareil que REM en DOS)
03 # remd: petit logiciel de traduction de mot simple anglais->françaisA ce propos, je profite toujours de ces lignes de commentaires pour entrer remd: ici sous le cheban. Ca me sers à retrouver mes explications quand à l'utilité du script. Comme ici en deux ou trois lignes j'explique que fait taf.
04 # et vice versa ainsi qu'une option Édit pour étoffer le dico.
05 # pensez à faire suivre le dico_af-fr.dico dans le même répertoire.
06 # alain adelmar 10 Août 2001. Version 1.02
les lignes 3,4 et 5 sont en commentaires et ne sont là que pour prévenir le programmeur qui voudrai savoir comment est écrit ce script. Je met toujours une balise remd: en seconde ligne (pour plus de précision voir quoi.html et alias.html ) cela me permet de me faire un idée. En tapant "quoi tafed" il me sort:
remd: petit logiciel de traduction de mot simple anglais->français
et vice versa ainsi qu'une option Édit pour étoffer le dico.
pensez à faire suivre le dico_uk-fr dans le même répertoire.
alain adelmar 10 Août 2001. Version 1.02
07 $dico = "dico_uk-fr";
la ligne 7 est une assignation*
c'est à dire que l'on alloue une valeur (ici le nom du dico) à une
variable scalaire* ($dico)
c'est à dire que la variable $dico aura comme valeur la suite de
caractères "dico_uk-fr"
c'est à dire que l'on va prévenir le programme que quand il verra $dico
c'est le nom du dico
On aurai pu le mettre ailleur
ou mieux le chercher et si on le trouve pas on previens
l'utilisateur sur son abscence en précisant que le programme
peut le créér ou le charger si il est sur un autre
support, dans ce cas on redonera la main à l'utilisateur. (Les
dernière version de taf ont cette possibilité)
08 # $kk = 0;
la ligne 8 ne sert à rien, car en commentaire, mais cette assignation de la
valeur 0 à la variable $kk est une initialisation
c'est à dire que l'on alloue la valeur 0 à $kk pour pouvoir s'en servir
plus tard. Bien que perl est capable de géré les variables
en leur assignant une valeur nulle si elle n'ont pas encore servie, il
peut être intéressant de savoir initialiser quelques
variables.
Quand il y en a plusieurs on écrit:
On continu, donc avec l'ouverture du fichier dico_uk-fr:
09 # lecture du dico******************************************
la ligne 09 est un commentaire qui sert à prévenir le programmeur des phases du script, ici il indique que l'on va lire le dico. Il n'est pas supérflue d'indiquer au programmeur c.a.d sur le code en commantaires ou en ai le script. Ca lui permet de savoir quelle ligne fait quoi?
10 open F, "$dico" or die "Ouverture de dico impossible $!";
la ligne 10 représente l'ouverture en lecture, d'un fichier. L'instruction
open
suivie de son
Filehandle*
(F) (toujours representé par une ou plusieurs majuscules)
que l'on va faire pointer, lier à "$dico" qui lui même
contient le nom du fichier. Ce Filehandel sers à ouvrir ce fichier (ici simplement en
lecture). + d'info sur open et F.
Si l'ouverture du fichier ne peut pas se faire correctement, soit parce qu'il est déjà ouvert ou parce qu'il est inexistant ou son orthographe est inexacte, qu'il à changé de place, enfin ....peut importe il faut arrêter le script et prévenir l'utilisateur de pourquoi le script s'est arrêté. Nous faisons tout ça grâce à la fonction or et l'instruction die suivies d'une ligne d'explication qui s'affichera en cas d'echec de l'ouverture du fichier dico_uk-fr.
11 @traduction = <F>;
la ligne 11 est aussi une assignation car elle créée à la variable liste @traduction en lui attribuant la valeur du contenu de dico_uk-fr, représenté par le handle de fichier F. On peut traduire cette ligne par:
- attribue la totalité du fichier dico_uk-fr qui est représenté
par F à la variable liste @traduction (un élément par ligne,
c'est à dire que chaque ligne du fichier $dico sera un
élément de la liste @traduction ).
ou
- créé
et prend en compte la variable liste @traduction comme étant le
contenu (ligne par ligne) du fichier représenté par le
handle de fichier <F> ($dico = "dico_uk-fr")
Personnellement je me représente les filhandel entouré de <F>
comme "tout le contenu de F", comme "tout ce qui arrive de" "la totalité de".
Bon récapitulons:
on a ouvert le fichier dico_uk-fr représenté par F
on a placer son contenu dans une variable liste qu'on a appelé @traduction
Il n'y a plus qu'à fermer le fichier. Puisqu'on a son contenu plus besoin de garder
ce fichier ouvert.
12 close F || die "fermeture impossible $!";
la ligne 12 ferme le fichier représenté par F (le handle de fichier) de la même manière qu'il l'a ouverte mais avec la instruction close. On aurai pu écrire comme à l'ouverture:
mais quand on ferme il n'ai pas nécessaire de répéter l'assignation
du handle , puisque Perl sait déjà que F représente
"$dico"
et les deux barres || représente le même
ou que or.
Souvent on a tendance à écrire juste:
close F
Mais il ne coûte rien de contrôler le retour de close et traiter l'erreur si elle à lieu. Maintenant on va présenter le traducteur et son menu
13 $x = "x*" x 25;
la ligne 13 est une concaténation*
c'est à dire que la valeur de la variable $x sera calculé et sera le
résultat de la chaîne de caractère "x*" multiplier par 25
c'est à dire 25 fois "x*" soit
"x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*"
Un expression qui doit être calculé et mis en forme est une concaténation
, c'est le résultat de 25 reproduction de "x*".
14 $donc = "\n\tdonc\n";
la ligne 14 est aussi une concaténation, une assignation à calculer.
Qui signifie que la variable $donc représente le signe
"\n" (un saut de ligne) + le signe "\t"
(une tabulation) a la suite,
suivie du mot "donc" + le signe "\n" (un autre saut de ligne, + un retour
chariot sous Windows).
Le tout est la valeur de $donc et donne:
$y = "$x$donc$x"; # nous aurions en sortie:
x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*
x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*
15 print "\n\n\n$x\n";
la ligne 14 est une concaténation de plusieurs signes précédés
de la fonction print.
L'instruction print
donne l'ordre d'écrire sur le STDOUT
(dans ce cas
l'écran, sur la console de l'application où vous avez ouvert le script ).
D'abord le signe "\n" qui est un saut de ligne retour chariot suivi de
deux autres puis la valeur $x puis un autre saut de ligne retour
chariot.
résultat:
3 saut de ligne/retour chariots + la valeur de $x + un autre
saut de ligne/retour chariot. Ça donne
x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*
16 MENU:print "\nBienvenu sur le petit traducteur tafed\n offert par a_l_a_i_n \/\/a_d_e_l_m_a_r aadelmar\@free.fr\n";
la ligne 16 contiennent beaucoup de chose voyons cela mot à mot (décomposons):
d'abord "MENU:" qui est une balise qui servira pour revenir à cet endroit
précisément plus tard dans le programme.
Puis la fonction print qui affichera à l'écran, (") "
guillemets ouvrant, qui marque le debut du block à printer, \n un retour
à la ligne suivi de Bienvenu sur le petit traducteur taf puis \n
saut de ligne, retour chariot puis offert par a_l_a_i_n puis la barre "\" qui
signifie dans ce concept (ne prendre en compte
le signe suivant que pour son aspect littéral, c'est à dire qu'un \\n ne
voudra pas dire saut de ligne mais juste les deux caractères \n, car l'anti-slash
devant signifie que le signe qui suit, n'a pas d'autre signification que
"une barre en travers" et un "n". Idem pour l'anti-slash devant l'arrobas "@" qui n'est
pas une référence à une variable liste mais simplement un arrobas.
Ceci est très important : Perl est un langage interprété, ça
veut dire qu'il interprete votre code comme il vient donc il faut toujours lire les signes
de gauche à droite en désamorçant avec les anti-slash ce qui doit
être désamorcé (les meta-caractères) ,voir la liste des
exo_commente.html metas ici.
17 print "Anglais-français(1)\nFrançais-anglais(2)\n Ajouter quelques lignes au dico(3)\t\t\treponse: ";
la ligne 17 comme la ligne 16 est une instruction print (décomposons la):
print
.......................... # imprime sur la sortie standard
(qui est l'écran)
"
................................. # tout ce qui sera compris entre ce " quillemet
et le dernier avant le point virgule
Anglais-français(1)
. # chaine de caractère litérale (ce que
l'on lit textuellement)
\n
............................... # la touche "Enter" qui permet le saut de ligne
est un caractere de controle, représenté par le signe \n ou \x0a
Français-anglais(2)
. # chaine de caractère litérale
(ce que l'on lit textuellement)
\n
............................... # saut de ligne donc toujours avec \n
Ajouter quelques lignes au dico(3)
. # chaine de caractère litérale
(ce que l'on lit textuellement)
\t\t\t
........................... # Tabulation ou shift elle est
représenté comme \t elle donne (l'indentation, le retrait a droite),
ici elle est triplé
reponse:
....................... # le mot reponse: suivi d'un espace,
pour garder la reponse sur la même ligne
"
................................. # et voici le dernier " guillemet qui cloture
le block &aecute; printer
;
................................. # le point virgule qui fini toute ligne de
code Perl, a quelques exceptions prés
la ligne 17 commence par une fonction print donc continu d'écrire sur
STDOUT, la sortie standard (l'écran), par défaut.
Oui print
affiche sa sortie sur STDOUT
lorsqu'il n'est pas suivi d'un handle de fichier (une ou plusieurs lettre majuscules).
Nous verrons plus loin comment écrire sur un fichier (ligne ).
récapitulation des deux dernière lignes 16 et 17: (ça donnera):
Voilà
ce que ça donne. C'est un menu, l'utilisateur prend connaissance
des choix qui lui sont fait et va donner le sien en entrant un
caractère suivi de la touche de validation <Enter
>.
Donc on va s'attendre à recueillir la réponse de l'utilisateur, et
ce sur le clavier (il a que ça pour s'exprimer dans cet exemple).
18 $trad = <STDIN>;
la ligne 18 assigne à la variable $trad la valeur que l'utilisateur lui donnera.
C'est à dire que <STDIN>
(l'entrée standard, le clavier) donnera
la valeur de $trad
. Tant que vous n'aurez pas entrée un mot ou une ligne
le programme sera stoppé car il attend la touche "\n" (Enter
) pour
valider l'entrée et du même coup la valeur de $trad
.
C'est ainsi que l'on questionne l'utilisateur en général . Important donc.
19 chomp $trad;
la ligne 19 va traiter la variable $trad
(qui est ce que vous avez
entré au clavier + la touche ><Enter> (pour valider))
par la fonction chomp
qui justement sert à ôter le dernier
caractère de la variable si et seulement si ce caractère et un "\n
"
(saut de ligne retour chariot, c'est à dire la touche de validation, la touche
Enter
qui justement sert à sauter une ligne et à renvoyer le
chariot au début de l'autre).
Et oui, lorsque vous appuyer sur Enter, vous valider une entrer mais aussi
accessoirement vous sauter une ligne et re-positionner le chariot sur le début
de la suivante. La fonction chomp
ôte cette touche si elle est
placer en fin de variable. On peut aussi écrire les deux dernière
phrase en une seule en tapant:
Qui signifie aussi ôte le saut de ligne a la reponse clavier que tu stockera
dans $trad
.
récapitulation avant de poursuivre plus avant: voici les lignes que l'on à vu.
--------------- passer la récap pour la suite01 #!perl –w 02 #************************************************* 03 #remd: petit logiciel de traduction de mot simple anglais->français 04 # et vice versa ainsi qu'une option Édit pour étoffer le dico. 05 # pensez à faire suivre le dico_af-fr.dico dans le même répertoire. 06 # alain adelmar 10 Août 2001. Version 1.02 07 $dico = "dico_uk-fr"; 08 # $kk = 0; 09 # lecture du dico *************************************** 10 open F, "$dico" or die "Ouverture de dico impossible $!"; 11 @traduction = <F>; 12 close F || die "fermeture impossible $!"; 13 $x = "x*" x 25; 14 $donc = "\n\tdonc\n"; 15 print "\n\n\n$x\n"; 16 MENU:print "\nBienvenu sur le petit traducteur tafed\noffert par a_l_a_i_n \/\/a_d_e_l_m_a_r aadelmar\@free.fr\n"; 17 print "Anglais-français(1)\nFrançais-anglais(2)\nAjouter quelques lignes au dico(3)\t\t\treponse: "; 18 $trad = <STDIN>; 19 chomp $trad;
Pour le moment on a ouvert le script en donnant un petit topo sur ce qu'il est
sensé faire ( en guise de commentaire )
On a indiquer aussi au script ou ce trouver le dico (dans $dico
)
On l'a ouvert, lu et stocké dans une variable liste @traduction
On à refermer ce même fichier.
puis on à afficher le menu de façon à ce que l'utilisateur sache ou
appuyer pour avoir ce qu'il veut.
Nous avons aussi récupéré sa réponse $trad que nous
avons nettoyé du dernier caractère qui est le "\n" (Enter)
Maintenant nous allons voir comment interpréter ce menu et signifier
à l'utilisateur que tout roule bien.
la suite dessous --------------------------------------
20 # menu possible de l'application**************************la ligne 20 en commentaire signifie au programmeur que le traitement du menu est ici au-dessous
21 if ($trad <= 1) {
ligne 21 première question avec if
: ici on teste $trad avec
l'instruction if
dans l'expression if ($trad <= 1) {
c'est à dire si $trad est
inférieur ou égale à 1 exécute le
BLOC qui suit ( ligne22 à 25 ).
Il y a une petite subtilité ici, je m'explique:
Bon on sais que $trad
est la réponse de l'utilisateur et que si il a compris
le menu il va taper un "1", "2", "3" ou "q" pour quitter.
Perl
initialise ses variables par défaut à 0
, donc si l'utilisateur n'a pas voulu entrer de chiffre et s'est contenté d'accepter en
appuyant sur ENTER
. Notre variable $trad vaudra 0
(puisque chomp $trad
à ôter le signe "\n
"
d'ENTER), donc par défaut ou si l'utilisateur à choisi 1
l'option Anglais-Français sera retenu pour cette session.
Donc maintenant on va voir le BLOC que va exécuter le programme si l'utilisateur
à entrer 1 ou rien.
22 print "$donc---- Anglais-français ----\n\n";
la ligne 22 est la première instruction du BLOC de contrôle if.
C'est à dire la première ligne d'instructions qui va être interpréter
si la valeur de l'expression est juste, vrai (si effectivement $trad vaut 0 ou 1).
Donc on va signifier à l'utilisateur que l'on à compris son choix en
écrivant grâce à l'instruction print
la variable $donc suivi de 4 tirets "-" puis
Anglais-Français + 4 autres tirets et deux saut de ligne retour chariot. Se qui donnera:
x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x* donc x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x* ---- Anglais-français ----
voilà l'utilisateur à compris dans quelle partie il est. Ici Anglais-français (l'ordinateur pas encore ... mais ça va venir)
23 $trad = "af";la ligne 23 justement renseignera le script de l'option choisi, pour le moment on réassigne $trad à une autre valeur:
24 &le_mot($mota);
ligne 24 appelle la fonction le_mot , qui s'appliquera avec, ou à, la variable $mota . C'est à dire que l'interpréter Perl va cherché la sous procédure le_mot et l'interpréter (faire, interpréter tout ce qui est dedans).
Le " & "
placer devant le_mot signale que la chaîne de caractère
le_mot
est une sous-procédure ou une fonction, enfin... quelque chose
que l'on doit faire
avant de poursuivre. On peut lire cette ligne comme:
appelle puis traite la procédure le_mot avec la valeur qui lui est assigné ($mota).
Cette fonction traitera le mot que vous saisirai comme étant un mot
anglais et cherchera ses traductions (mais ceci est une autre affaire, qu'on
verra plus bas).
25 &anglais_francais;
la ligne 25 appelle la sous-procédure anglais_français , qui va traiter le cas ou vous entré un mot anglais et vous désirez savoir par quel mot français il est traduit.
26 }
La ligne 26 est l'accolade fermante, elle ferme le bloc résultant de if ($trad <=1) { c'est à dire la marche a suivre si true (vrai) .
27 elsif ($trad == 2) {
suite à la première question avec
if
: ici on teste $trad avec
l'instruction elsif
dans l'expression
($trad <= 2)
c'est à dire si $trad est inférieur ou égale
à 2 exécute le
BLOC
qui suit (ligne 28 à 32).
Il y a une petite subtilité ici, je m'explique:
Bon on sais que $trad est la réponse de l'utilisateur et que si il a compris
le menu il va taper un "1", "2", "3" ou "q" pour quitter. Si notre
variable $trad vaut 2 c'est que l'utilisateur veut une session
Français-Anglais,
c'est ce que le bloc qui suit va traiter. Donc maintenant on va voir le
BLOC que va exécuter le programme si l'utilisateur à
entrer 2.
28 print "$donc---- Français-Anglais ----\n";
La ligne 28 valide le choix de l'utilisateur pour Français-Anglais en lui
printant (imprimant sur la sortie standard, qui est l'écran) car la
fonction print
sans options (d'handel de fichier) écrit
toujours sur la sortie standard (imprimante ou écran suivant le
choix par défaut).
Le contenu de la ligne sortie sera donc: la variable
$donc
défini ligne 14 suivie de la suite de la ligne
littéralement, c'est à dire
---Français-Anglais---
suivi d'un
\n
renvois à la ligne et d'un retour chariot => Fin de la ligne
et on ce positionne sur la ligne suivante.
J'en profite pour expliquer que tout les termes ce trouvant dans un "entre
guillemet" après une fonction print est
concaténé
et interprété, c'est à dire les variable sont
remplacés par leur valeurs le tout à la queux le le
(à la suite)
29 $trad = "fa";
assignation de la valeur " fa " à la variable $trad . Maintenant $trad vaut "fa" => la traduction est posé en mode Français-Anglais
30 &le_mot($mota);
La ligne 30 oriente le programme vers la fonction
le_mot ayant comme variable associé
$mota .
ligne 30 appelle la fonction le_mot, qui s'appliquera à la variable
$mota
.
C'est à dire que l'interpréteur Perl va cherché la
sous procédure le_mot et l'interpréter (faire,
interpréter tout ce qui est dedans avant de continuer).
Le " & " placer devant le_mot signale que la chaîne de caractère
le_mot est une sous-procédure ou une fonction, enfin... quelque chose
que l'on doit
faire
avant de poursuivre. On peut lire cette ligne comme:
appelle puis traite la procédure le_mot avec la valeur qui lui est assigné ($mota).
remarque:
$mota est
une variable qui peut désigner le mot anglais comme le mot
français.
la différence entre l'un et l'autre ce fait par le mode
af ou fa que vous avez faite dans le menu.
Mais nous verons cela plus loin.
31 &francais_anglais($trad);
la ligne 31 appelle la sous procédure français_anglais, qui va traiter le cas ou vous entré un mot français et vous désirez savoir par quel mot anglais il est traduit, la variable $trad n'est pas indispensable et n'est la que pour associer une variable à la réponse, qui n'en a pas besoin, mais bon... c'est pas vilain non plus?!.
32 }
fermeture de l'accolade qui ferme le BLOCK d'instructions de l'éventualité du choix français-anglais c'est à dire la réponse symbolisée par le chiffre "2"
33 elsif ($trad >= 3) {
La ligne 33 poursuit le contrôle retour du menu et teste l'éventualité du désir de l'utilisateur d'éditer son fichier ressource "dico_uk-fr" symbolisé par la réponse "3". Elle peut ce lire comme ceci:
34 print "$donc---- Ajout au Dico perso ----\n";Le but de cette ligne est simplement d'indiquer à l'utilisateur que son choix d'éditer son dico (dico_uk-fr) à été pris en compte. Grâce à l'instruction print, ce qui se trouve entre les guillemets va être interprété . C'est à dire "$donc--- Ajout au dico perso ---\n"
$donc
sera remplacer par sa valeur$donc = "\n$x\n\tdonc\n";
\n
étant le retour à
la ligne et \t
la tabulation, on aura
x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x* donc x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x* ---- Ajout au dico perso ----
35 print "Les lignes que vous ajoutez à votre dico personnel\n doivent être écrites:\n mot_anglais,mot_français1,mot_francais2,mot_français3|exemple_angl= en_français\n";
Ligne 35 idem l'instruction print va interpréter puis imprimé
sur votre écran qui est le STDOUT ,
la sortie par défaut, la totalité de ce qui est
écrit entre guillemets.
C'est à dire qu'il va inscrire un topo sur la façon dont vous
devez entrer les lignes de traductions en montrant un exemple de ligne
correctement entrer.
Texte qui sera affiché sur l'écran de l'utilisateur du
programme:
Les lignes que vous ajoutez à votre dico personnel
doivent être écrites:
mot_anglais,mot_francais1,mot_francais2,mot_francais3|exemple_angalis=exemple_francais
pour faire comprendre à l'utilisateur d'écrire le tout sans espaces entre les mots, pour que les définition soit exploitables par le dico et compatibles avec d'autre dico et updico.pl.
36 print "(ne laisser pas d'espace entre les mots, juste une virgule)\n";
Ligne 36 idem affichera à la ligne (ne laisser pas d'espace entre les mots, juste une virgule)
37 print "on y va? (o/n)\t";
Ligne 37 toujours avec print affichera
on y va? (o/n)
donnant ainsi la main à l'utilisateur en le faisant participé de façon logique, ayant lu les lignes soit il est ok et il confirmera en appuyant sur Entrée ou sur o de "ok" ou bien il sortira en tapant non (voir ligne 40)38 $trad = "ed";
Ligne 38 assigne à la variable $trad la chaîne de caractères "ed" (pour édition) car depuis la ligne 33 nous traitons la possibilité que l'utilisateur est choisi l'édition c'est à dire est entré 3 au clavier (le troisième choix)
39 chomp ($repond = <STDIN>);
Ligne 39 signifie "enlève la merde qui dépasse de la
réponse que te fera l'utilisateur au clavier (c.a.d le saut de ligne)
et stocke la (la reponse seule) dans la variable $repond".
Mot à mot maintenant en sachant
que l'interprétation ce fait toujours de droite à gauche:
$repond=<STDIN>
l'attribution de la valeur composé au clavier
(qui est le STDIN (Standard In)) à la variable
$repond mais nettoyé de la touche de validation Enter par
chomp
La fonction chomp sert à ôter le saut de ligne retour chariot
car lorsque vous entrer une valeur vous la validée par Enter
qui veut toujours dire saut de ligne, retour chariot. chomp sert à ôter
ce saut de ligne retour chariot de la variable pour ne laisser que ce que vous avez
entré.
(il y a plusieurs fonctions pour faire cela en Perl chop par exemple
ôte systématiquement le dernier élément d'une variable
ou d'une liste mais il peut ne pas sortir toute la validation car suivant le système
qu'on utilise (UNIX ou Windows) le contrôle CR+LF ce fait sur plus d'un caractère
de contrôle. D'une manière générale il vaut mieux prendre
l'habitude de nettoyer la valeur par chomp plutôt que de ce servir de chop
ou de tout autre moyen de contrôle, mais maintenant vous faites comme bon vous
semble).
40 &oui_non($repond);
Ligne 40 est un appel à la sous procédure , fonction oui_non équipé d'une variable ici c'est $repond. C'est à dire que lorsque l'interpréteur arrivera sur cette ligne il interprétera dans sa totalité la sous-procédure oui-non avant de continuer.
Il lira et interprétera les ligne de 133 à 147 avant d'interpréter la ligne suivante (41).
On reconnaît les sous procédures et autre fonctions au préfixe "&" comme &edition sur la ligne suivante.41 &edition;
La ligne 41 est justement un appel à la sous procédure edition. C'est à dire "va dans la sous procedure edition est interpréte la entièrement".
42 }
La ligne 42 est une accolade fermante signifiant la fin du block d'instruction commencant Ligne 33 et résultant du controle possitif
"elsif ($trad >= 3) {".
43 print "\n$x\n";
Encore un print pour la ligne 43. L'instruction print qui imprimera à l'écran un saut de ligne, $x (qui est une ligne *x*x*x*x) et un autre saut de ligne.
44 print "tchao !!!\n$x\n";
La ligne 44 idem que 43 mais ajoute à celle ci en imprimant à la suite "Tchao !!!", un saut de ligne puis une ligne de "*x*x" et un autre saut de ligne donnant à l'écran un message d'au revoir
*x*x*x*x*x*x*x*x*x*x*x*x*
Tchao !!!
*x*x*x*x*x*x*x*x*x*x*x*x
45
La ligne 45 est vide et ne sert qu'a rendre plus lisible le code
46 sub anglais_francais {
La ligne 46 est le début de la sous procedure anglais-francais, elle débute par sub. Le block d'instruction demmarre à la fin de la ligne par l'accolade ouvrante "{" .
47 while ($mota ne "q"){
La ligne 47 est un controle de type boucle exécuter par l'instruction
while qui signifie ( tant que )
et qui dans l'exemple signifie:
tant que le mot anglais n'est pas égal au caractère "q"
exécute ce qui est dans le block suivant l'accolade ouvrante.
Nous avons donné à
l'utilisateur la possibilité de quitter en tapant la lettre "q"
donc cette ligne signifie que :
dans le contexte Anglais-Français tant que la variable scalaire $mota
(donner ou entrer) n'est pas la lettre "q" (qui veut dire
quitter) effectuer le traitement compris dans la boucle while.
Nous verrons par la suite que le caractère q sera donné par
l'utilisateur quand il aura fini d'utiliser les fonctionnalité anglais-francais.
On aurez pu l'écrire autrement mais bon ca géne pas...
48 foreach $ligne(@traduction) {
La ligne 48 est la fonction foreach
qui s'appliquera dans la liste @traduction pour chaque élément ou pour nous $ligne qui
signifie comme on peut le lire "pour chaque ligne de la liste de ligne
@traduction fait". L'acollade ouvrante demarre la boucle et donc chaque
ligne de code (appelé Block) devra être traité pour
chaque ligne de @traduction, jusqu'a l'accollade fermante (qui ce
trouve ligne 61).
49 chomp($ligne);
La ligne 49 demande que chaque ligne de @traduction soit débarassée
de son retour chariot, saut de ligne. Pour qu'il n'y ai que les caractères
formant la ligne. La fonction chomp nettois les fin de lignes (voir plus haut)
Notons que l'on aurai pu écrire:
50 # laisser comme ça car plus complet
La ligne 50 est un commentaire pour le programmeur qui lira le code, il est ignoré par l'interpréteur Perl.
51 if ($ligne =~ /^$mota/) {
La ligne 51 est le commencement d'une boucle "if" et signifie "si la ligne commence par le mot anglais" ou dans la logique de notre programme, comme le tout est incorporé dans un foreach qui épluche tout le dictionnaire, cette boucle signifie trouve le mot rechercher dans le dico et ensuite effectue ce qui ce trouve dans le block issu de la boucle.
52 ($line, $exemple)= split(/\|/, $ligne);
Pour comprendre la ligne 52 il faut savoir que split veux dire découpé.
et que les parenthése suivant split contiennent toujours:
- la facon de découper entre deux slashs, exemple: (3, 14159)= split(/,/ pi);
- et ce que vous voulez découper, meme exemple (veut dire coupe pi par la virgule)
La ligne 52 est une assignation (comme $a = 1;)
mais là c'est de deux variables par la fonction split.
Cette assignation va donner une valeur à chaque variable $line et $exemple par le
découpage de la ligne. Elle va nous servir à séparer la ligne du
dico en deux partie bien distinctes, d'un coté line avec le mota
suivi de ses traductions et de l'autre les exemples si toutefois il y en à.
En effet nous avons convenu de séparer la traduction des exemple
par une barre droite "|". split va les dissocier, voyez l'exemple:
$ligne="white,blanc|white horse=cheval blanc"
si on applique un split sur $ligne par le caractère " |" on obtient
$line = "white,blanc"
$exemple= "white horse=cheval blanc"
53 ($angl,$fr, $fr1, $fr2, $fr3) =split(/,/, $line);
La ligne 53 est aussi une assignation, elle va donner une valeur à
$angl $fr $fr1 $fr2 $fr3
par le découpage de $line par virgule "
," à l'aide de split.
Je m'explique, split découpe $line
(qui est une ligne du dico-uk-fr) par portions qui
sont entre les virgules et comme la ligne est construite comme:
big,grand,gros,massif,important
une fois passer dans split(/,/, $line) la ligne donnera: un liste composée de big grand gros massif, important classée tel quel donc assignant a$angl="big", $fr="grand", $fr1="gros", $fr2="massif", $fr3="important".
Si il y avait que deux traductions dans la ligne et bien $fr2 et $fr3 serai égale à un mot vide, $fr2= $r3="";
54 print "$angl = $fr\t$fr1\n";
La ligne 54 affiche sur la sortie standard (l'écran) par l'instruction print
le mot anglais ($angl) suivi d'un espace puis du signe égale "
=" puis du premier mot francais ($fr)le traduisant puis d'une
tabulation "\t" pour rendre plus
visible et du second mot français ( $fr1 ) le traduisant, ce qui donne:
big = grand gros
55 if ($fr2 ne "") {
La ligne 55 est un controle if demandant si la troisième traduction du mot anglais à été allouée c'est à dire si elle n'est pas vide pour pouvoir l'afficher (commande suivante) Remarque : on aurai pu faire tout sur la ligne 54 en écrivant:">
print "$angl = $fr\t$fr1\t$fr2\t$fr3\n";
ce qui ne change rien vue que si $fr2 et $fr3 n'ont pas étaient alloués ils ne seront pas affiché, enfin si mais comme ils sont vide rien ca ce voit pas.56 print "$angl = $fr2\t$fr3\n";
la ligne 56 affiche la 3eme et 4eme traduction du mot anglais $mota;
57 }
Fin du BLOCK de commande pour l'insruction if de la ligne 55 représanté par l'accolade fermante.
58 if ($exemple ne "") {
La ligne 58 demande par l'instruction if si la ligne et pourvu d'un exemple (si $exemple n'est pas vide)
59 print "exemple: $exemple\n";
Dans ce cas afficher la teneur de l'exemple $exemple suivant le format de print: afficher le mot "exemple" suivi de deux point " :" suivi d'un espace puis de l'exemple ($exemple) comme il est entrer par l'éditeur puis d'un saut de ligne "\n" c'est à dire:
exemple: I have a big noise = j'ai un gros son
60 }
Fin du BLOCK de commande pour l'insruction if de la ligne 58 représanté par l'accolade fermante.
61 }
Fin du BLOCK de commande pour l'insruction if de la ligne 51 (demandant si la ligne commencer par le $mota) représanté par l'accolade fermante.
62 }
Fin du BLOCK de commande pour l'insruction foreach de la ligne 48 (traitant tout les ligne du dico_uk-fr) représanté par l'accolade fermante.
63 &choix;
La ligne 63 envoi l'interpreteur de commande Perl dans la sous procedure choix, le "&" placer devant indique que choix est une sous procedure. Elle devra étre entierement traiter avant de continuer.
64 }
Fin du BLOCK de commande pour l'insruction while de la ligne 47 (qui signifi que l'utilisateur à entrer simplement la lettre q aprés le menu pour signifier au programme sont desir d'arreter) représanté par l'accolade fermante.
65 # print "tchao !!!\n";
affichage d'un salut de la bécane à l'utilisateur mit en commantaire (donc pas pris en compte par l'interpreteur de commande Perl)
66 }
Fin de la sous proccedure anglais-francais de la ligne 46 représanté par l'accolade fermante.
67 sub francais_anglais($trad) {
La ligne 67 marque le debut de la sous proccedure francais_anglais
(a part quelques modifications c'est la même que anglais_francais
mis a part que l'on ce fixera plus sur la premiere traduction francaise comme reference,
bien qu'il les traite toutes).
Cette sous procedure est passer avec un argument $trad qui vaut les deux lettre represantant le
mode "af" ou "fa" ou "ed" mais comme on le printe pas ca ne sert a rien.
68 while ($mota ne "q"){
La ligne 68 construite avec la fonction while
(pendant que) doit être comprise dans le sens:
Tant que quitte n'est pas appellé fait ceci
ou plus litteralement
Tant que $mota (représentant la variable par defaut)
n'est pas la lettre "q" de quitte tu peut continuer à
interpé le BLOCK qui suit
69 foreach $ligne(@traduction) {
La ligne 69 n'est pas érotique, elle est construite avec la fonction,
instruction, boucle foreach.
On à déjà vu le comportement de foreach.
Il permet de controler le contenu d'une liste d'elements, ici la liste est
le fichier dico, et les element sont chaque lignes du fichier.
foreach va permettre de passer chaque ligne en revue.
Chaque fois que le script fait un passage dans cette boucle et ce jusqu'a la
fin de celle-ci, une ligne est présenté.
De la première à la dernière,
de $traduction[0] (la premiere) à $traduction[$#traduction]
(la derniere).
Chacune des lignes, élément, la variable par defaut "$_"
sera $ligne puisque on la nomée.
Si on ne l'avait pas nomée ce serai "$_" qui représenterai
la ligne, enfin plutôt c'est $_ que l'on intérogerai, qui est
implicitement interogé.
Exemple: foreach (@traduction) { print "cette ligne commence par a\n" if /^a/; # le if demande implicitement à $_ si il commence par a print "cette ligne commence par a" if ($_=~ /^a/); }
Tout ceci ce trouve mieux expliqué dans les pages de doc en français sur perl enstimac
70 ($line, $exemple)= split(/\|/, $ligne);
Re-voici un exemple de split qui cinde en deux une ligne par son exemple
(vu qu'il n'y à qu'un exemple par phrase)
Place la ligne des traductions dans une variable $line et l'exemple dans l'autre
$exemple (qui peut etre vide). Il suffira de re-cinder la ligne $line (donc
épurer de l'exemple) par la virgule pour avoir, le mot anglais, la premiere
traduction fr la deusieme etc...
Ce qui est fait justement dans la ligne de code suivante
71 ($angl, $fr, $fr1, $fr2, $fr3) =split(/,/, $line);
Ca deviens limpide non? on a une ligne de ce type au demarrage:
foo,bar,tartenpion|am crazy of this pub=je suis foo de ce bar
aprés ($foo, $bar)= split(/\|/, $phrase); il reste
$foo vaut
foo,bar,tartenpion
$bar vaut
am crazy of this pub=je suis foo de ce bar
puis si on passe $foo a la moulinette de split comme
($mot1, $mot2, $mot3)=split(/,/, $foo);
on aura $mot1 $mot2 $mot3 et $bar en guise d'exemple
72 if ($fr =~ /^$mota/) {
Ici nous avons une recherche de concordence construite avec if et la recherche
de motif =~ m// trés classique;
il faut lire la ligne comme ceci:
if ($fr =~ /^ $mota/) { si le premier mot français commence par le motif fait
73 print "$fr = $angl\n";
Donc si ca ce produit affiche a l'écran le mot que l'on cherche à traduire par son équivalant anglais
bleu = blue
74 }
fermeture du block
75 if ($fr1 =~ /^$mota/) {
Ici on recommence l'opération faite ligne 73 mais avec le deusiéme mot
français et ainsi dessuite tant qu'il y a des traductions (c'est la seule
façon de rendre réversible cette construction de dico.
Bien sur on aurai pu faire comme les fichier po et entrer msgid=mot anglais et
msgstr=le mot français et les exemples) mais c'est une autre histoire...
un autre script.)
Avec Perl on peut vraiment tout faire, même de décomposer en adverbe,
verbe, adjectif, etc et conjugué le tout on aurai donc un traducteur de
texte et non de mots. Mais ça demanderai beaucoup plus de travail en
entrée et en programmation, et beaucoup de temps. Mais c'est faisable...
Il y a bien des gens qui ont écris des encyclopédies, alors ...
76 print "$fr1 = $angl\n";
Et on affiche le résultât comme au dessus
bleu = blue
77 }
fermeture du block
78 if ($fr2 =~ /^$mota/) {
On y crois toujours, bien que trois traductions pour un meme mot deviens de plus en plus improbable. voir ligne 72 et ligne 75
79 print "$fr2 = $angl\n";
idem ligne 73 et 76, on aurai pu faire une sous-procédure ... et oui quand on recommence 3 ou 4 fois la même chose sur plusieurs ligne il vaut mieux faire une sous-procédure. par exemple celle-ci aurai bien fait l'affaire et aurai économisé 5ligne de code. on aurai appelé la sous-procédure &affiche_af;
&affiche_af; sub affiche_af { @lsfrm = qw($fr $fr1 $fr2 $fr3); foreach (@lsfrm) { if ($lsfrm[$i] =~ /^$mota/) { print "$lsfrm[$i] = $angl\n"; $i++; } } }
Il y a une version beaucoup plus récente de taf, celle ci que j'ai commenté est une des première, elle fonctionne mais, pfff...
80 }
Fin de block
81 if ($fr3 =~ /^$mota/) {
Voila une fois de plus on opére un contrôle sur une traduction, pour voir si dans les traduction il n'y aurai pas un mot français qui serai pareil que celui que l'on cherche à traduire, et dans l'altérnative heureuse qu'il y figure, on lui fera afficher le mot anglais qu'il était sensé traduire. Le premier de la ligne />$angl.
82 print "$fr3 = $angl\n";
idem que plus haut on affiche:
souvant = often
83 }
Fin de block if
84 }
Fin de block foreach
85 &choix;
La ligne 85 est un appel à la sous procédure &choix, celle qui g`re le menu.
Nous somme dans le block de sous-procedure Anglais_Français,
nous avons demandez un mot français pour savoir comment il ce dit en anglais.
nous somme toujours dans le block while not quitte
donc soit on a eu une reponse, soit elle n'hexiste pas
(on aurai pu placer un else avant d'aller au menu pour prevenir l'utilisateur que sa recherche est infructueuse,
comme dans Ang-fran. Afin la dernière version de taf le prend en compte.
Donc nous finissons ce block pour demander à l'utilisateur si il veut continuer:
A chercher un mot (anglais ou français) à traduire
A &eactue;diter son dico en entrant une traduction
Ou à quitter parceque c'est l'heure de la soupe
86 }
fermeture de while not quitte donc on sera ici que si on veut quitter.
On ne sera ici que si l'utilisateur a tapé "q", après une traduction fr-ang.
Car si on avait voulu aller au menu on ne serai pas là.
87 # print "tchao !!!\n$x\n";
le print tchao est en commentaire ... désolé, je ne me rappelle plus pourquoi
Il faut dire que j'ai commencé ce document avec un de mes script (sans trop choisir), c'était pas le mieux écrit ni le plus à jour, je l'ai trouvé juste marrant et pratique et modifiable à souhaits.
Veuillez m'en excuser.
88 }
Fermeture de la sous-procedure Francais-anglais
89 sub edition($trad) {
Édition, édition quand tu nous tiens...
Nous voici dans la procedure edition, c'est ici que l'on va gérer l'édition du dico_uk-fr
Deux mots en gros pour expliquer ce que nous allons faire ici:
C'est un bon moyen d'enrichir son dictionnaire de traduction que de pouvoir quand on l'utilise ajouter quelques mots, c'est souvant qu'en cherchant une traduction on apprend un ou deux mots que l'on avait oublié
90 while(! oui_non($repond)) {
La ligne 90 est construite avec while qu'on a déjà vu plus haut, qui veut dire tant que mais la condition est accés sur le retour d'une sous procedure qui renvoi normalement vrai.
Mais ici on va tabler sur son retour faux.
On peut écrire une fonction afin quelle retourne vrai ou faux.
Ici donc on pourrai dire:
Tant que le retour de la fonction oui_non n'est pas ok
91 LABEL:print "\nEntrez votre ligne\n";
Ici LABEL est une balise, un genre de token qui mémorise l'endroit du script ou il pourra accéder de nouveau par l'instruction goto LABEL; C'est comme une entrée de boucle mis à disposition.
92 chomp ($ligne_in = <STDIN>);
la fonction chomp ote comme on l'a vue le saut de ligne obligatoirement présent lors d'une saisie clavier.
C'est à dire que $ligne_in qui est la ligne de traduction que vous venez d'entrer par le moyen du clavier (
93 ($linei, $exemplei)= split(/\|/, $ligne_in);
De la même façon que ligne 70 la ligne 93 cinde la variable $lign_in (votre enregistrement) en deux variables distinctes par la fonction split. Comme split va couper au niveau de la barre droite | (qui marque l'exemple).
$linei contiendra les traductions et $exemple (l'exemple) si vous en avait entré un sinon il sera vide (c'est souvent le cas).
94 ($angli, $fri, $fr1i, $fr2i, $fr3i) =split(/,/, $linei);
Puis toujours grace à la fonction split la variable $linei sera re-cinder en autant de variable que de virgules.
A fond il y en aura 5.
95 foreach $ligne(@traduction) {
la fonction foreach (pour chaque) lignes $ligne de la variable liste "@traduction" execute ce qui est entre les accolades.
96 ($line, $exemple)= split(/\|/, $ligne);
comme plus haut, chaque ligne de traduction va etre cindée par la barre (Alt-6), par split en deux var: $line et $exemple
97 ($angl, $fr, $fr1, $fr2, $fr3) =split(/,/, $line);
Ici aussi grace à la fonction split, la variable $line sera re-cinder en autant de variable que de virgules, "/,/"
Au max, il y en aura 5.
98 if ($angl eq $angli || $fr eq $fri ) {
Litteralement si le mot que j'ai entrer en tant que mot anglais est égal "eq" au mot anglais de la ligne de "@traduction" et/ou "||" que la première traduction française que je viens d'entrer dans mon enregistrement d'edition son identique "eq" le premier mot français de la ligne de la liste @tradition et bien previens l'utilisateur, pour qu'il décide de ce qu'il compte faire. fastoche...
pour faire court: si tu a déjà le mot anglais ou le mot français klaxonne
99 print "cette ligne présente des similitudes avec la ligne:\n";
et voici le coup de klaxon, représenté par un beau print qui affiche à l'écran, un timide:
cette ligne présente des similitudes avec la ligne:
100 print "$angl = $fr\t$fr1\t$fr2\t$fr3\t$exemple\n";
on montre donc la ligne qui ce trouvait déjà dans le dico mais sous cette forme:
token = balise jeton borne marque
101 print "voulez vous quand même entrer votre ligne dans le dico?\n";
Demande de confirmation pour garder quand même la ligne, ou pour ne pas enregistrer la dernière ligne, par print.
102 $resp = <STDIN>;
receuil de la reponse de l'utilisateur au clavier <STDIN<.
103 chomp $resp;
nettoyage de cette reponse par chomp qui ote le saut de ligne.
104 if ($resp =~ /^n/i) {
si la reponse commence par un n, et oui car si l'on avait demander si la reponse commencer par le o de oui, il y aurai des malin pour repondre yes ou autre, alors que non ou no sa commence toujours par "n" et rien ne peut acciéser et commencer par "n" donc pas de surprise.(au fait le "i" placé derrière le motil (la regexp) signifie que peut importe la casse (majuscules ou minuscules) si la reponse est "N" ou "n" ou "non" ou "NON" ou "Non" ca matchera, ca sera pris en compte.
105 print "elle ne sera donc pas intégré à votre dico\n";
si bien sur la reponse est "n" ou "non" ou "Non" ou "N" ou "NON" ou "no" ou "NO" ou meme "non merci" on confirme à l'utilisateur que sa phrase, (son enregistrement ne sera pas pris en compte, comme il l'a souhaité.
106 goto LABEL;
On envoi l'interpreteur au label LABEL ligne 91
107 }
fin du block if de la ligne 104.
108 }
Fin de block de if ligne 98
109 }
fin de block de foreach ligne 94
110 $ligne_in = "$ligne_in" . "\n";
on ajoute une fin de ligne à la ligne entrer de manière à avoir un enregistrement adéquat pour dico.
111 push @traduction, $ligne_in;
On pousse cette ligne dans la liste traduction, au cas ou on pourrai s'en servir avant de quitter mais on aurai pu directement la printer a la suite dans le fichier dico. Pour ce cas il aurai fallu ouvrir le fichier dico avec le signe >> ajout, comme:
open DICO, ">>dico_uk-fr" or die "ouverture du $dico impossibe $!";.
112 print "on continu? (o/n):\t";
on demande à l'utilisateur si il veut continuer d'ajouter des traductions a son dico.
113 chomp($repond = <STDIN>);
on regarde la reponse du coté du clavier en prenant soin d'oter le saut de ligne.
114 }
Fin du block avant l'enregistrement qui ce fera sur la prochaine ligne.
115 open(D, ">$dico") or die "Ouverture de $dico impossible $!";
La ligne 115 re-ouvre le
fichier dico_uk-fr en ecriture grace à l'instruction open auquel
on assigne un filehandel avec un nom en majuscule, ici D, au fichier
qu'il represente, là $dico (qui est la variable scalaire
representant le vrai nom du fichier ./dico_uk-fr ou C:\doc\dico_uk-fr
suivant ou vous l'avez installer)
La ligne veut dire mot pour mot:
open (D, ">$dico") or die "Ouverture de $dico impossible $!"
ouvre le handle de fichier "D", en écriture (le signe ">" pour ecriture, le signe "<" pour lecture) qui representera le fichier $dico , or (ou) die (arrete) l'interpreteur avec le message d'erreur Ouverture de dico_uk-fr impossible" erreur sur num de ligne 115 ($!);
La on écris par dessus le contenu du fichier et ca marche
étant donner que l'on à un contenu @traduction plus
important que l'initial vue que l'on à ajouter les nouvelles
lignes grace à la commande push de la ligne 111.
Cette methode est dite d'écrasement, on lit, on ajoute et on écrase en replacant les données sur le fichier.
116 print D @traduction;
rempli le déscripteur D qui represente le fichier dico_uk-fr avec le contenu de la variable liste @traduction.
On aurai pu aussi bien stocker les modifs dans une petite liste que l'on aurai ajouté à dico
mais, pour cela, il aurai fallu ouvrir le dico, en mode ajout >> au lieu d'écriture simple >.
117 close D or die "fermeture impossible $!";
On ferme le déscripteur D et donc le dico qu'il represente et on previen
l'utilisateur si ca n'a pas pu ce faire ou qu'il y a eu une erreur.
Notez qu'on aurai pu écrire simplement:
qui remplissent aussi les même fonctions.
118 print "Vos lignes ont été rajouté au dictionnaire de traduction $dico\n";
On préviens l'utilisateur, en affichant à l'écran, que ses lignes ont été
rajouté à son dictionnaire de traduction.
119 &choix;
Maintenant on va orienter l'utilisateur vers la sous procedure choix en ajoutant
simplement le caractère & devant.
Quand on prefixe un mot du caractère & on indique à Perl que cet une sous
procedure ou une fonction, et qu'il faut qu'il l'interprete avant de continuer.
120 }
fermeture du block d'instruction
121 sub choix {
Ouverture de la sous procedure choix c'est elle qui va demander à l'utilisateur si il veut continue en entrant une autre traduction, ou si il veut s'arrêté là.
122 print "---------- (q) quitte, (m) menu ou un autre mot:\n";
Donc ici on demande par l'affichage de cette ligne à l'écran, à l'utilisateur d'entrer
un "q pour quitter
un "m" pour menu (au cas ou il voudrai faire de la traduction, ou verifiez un truc)
ou "Enter" pour un autre mot. (Pensez à simplifier toujours les actes par defaut).
123 $mota= <STDIN>;
Voilà on recupère la reponse par l'intermediaire du clavier dans la variable $mota.
c.a.d: variable $mota vaut ce qui arrivera du Standard IN &STDIN& du clavier.
124 chomp $mota;
On ôte le caractère fin de ligne "\n" à la reponse, pour ne garder que ce qui nous intéresse, ici la reponse sans la validation. (voir plus haut)
125 if ($mota eq "m") {
Ligne 125 on passe au crible toutes les reponses possibles pour demander à Perl d'agir en consequence.
Ici on demande si la reponse est le mot "m" (pour menu) .
Si oui ou vrai ou (true)
on va au menu comme le desire l'utilisateur en interpretant le block qui suit.
par la condition d'egalité "eq" qui veut dire égal, donc est.
(Il y a plein d'operateurs sequence de mots ou de signes qui testerons vaut variables par rapport à ce que vous voulez, dans Perl).
pour le chaines (string) pour les nombres (num) exemples eq egale == égale à. ex: ($b == $c) => vrai ne pas egal != différant de ex: ($b != ($f=34727)) => vrai le inférieur ou égal <= plus petit ou égale ex: ($b <= $c) => vrai lt inferieur < plus petit que ex: ($b < $f) => vrai nt superieur > plus grand ex: ($b > $c) => faux ne superieur ou égal >= plus grand ou égal ex: ($b >= $c) => vrai en vrac quelques autres: ** élévation à la puissance && et logique || ou logique ++ incrémentation -- décrémentation not non logique and et logique or ou logique et xor ou exclusif | ou bit à ^ ou exclusif bit à & et bit à ?: (si-alors-sinon) (if-then-else)
Il y en à beaucoup d'autres voir ici ou encore mieux à la source de la doc française Paul Gaborit à l'enstimac (la doc la vrai pour Perl)
126 goto MENU;
aller à la sous procedure menu
127 }
128 }
129 sub le_mot($mota) {
130 print "entrer votre mot pour le traduire ou (m) menu ou (q) quitter)\n";
131 chomp ($mota = <STDIN>);
132 }
133 sub oui_non($repond) {
134 my ($repond) = @_;
135 $repond =~ tr/A-Z/a-z/;
136 if ($repond =~ /^o|y/) {
137 return 0;
138 }
139 elsif ($repond =~ /^n/) {
140 return 1;
l'instruction return
141 }
fin du block
142 else {
la fonction else sans rien, ramasse tout ce qui n'a pas été pris par if ou elsif.
143 print "\a";
144 print "Veuillez repondre par Oui ou par non\n";
invite l'utilisateur à ce pronocer par oui ou par non en affichant la phrase entre guillemets à l'écran par l'instruction print.
145 chomp ($repond = <STDIN>);
ligne 145 instruction chomp pour ôter le caractère de conrôle /n fin de ligne.
146 &oui_non($repond);
appel à la sous procedure oui_non
147 }
fin du block
148 }
Fin du block
149 END;
Cette ligne est la dernière elle signifie à Perl que le programme est terminé, elle vide les variables de leurs contenus.
variable scalaire:
une variable scalaire est une variable qui ne contient
qu'une information, qu'une valeur. Maintenant cette information, cette valeur
peut être faite de plusieurs caractères, mais le tout ne
représente
qu'une information. On pourrai remplacer scalaire par
singulière.
Elle est représenté toujours avec un signe $ qui la
précède.
exemple: $s = "sardine";
Dans Perl il y à 3 types de variables prisent en compte: les
variables scalaires, les variables listes (ou tableaux) et les
variables de hashage.
une variable liste ou variable tableau est une variable
qui
contient un liste d'élément, de valeur. Maintenant elle
ne
peut contenir qu'une valeur (si la liste n'a qu'un
élément).
Les variable liste appelé aussi variable tableau sont
représentés
par le signe
@
qui les précédent.
exemple:
@s = ("s", "a", "r", "d", "i", "n", "e");
En régle générales _@ contient tous ses
éléments
_$ et donc implicitement Perl se sert de $_ qui est
l'élément
que l'on contrôle et @_ la liste en question. Nous pourrons donc
analyser chaque element d'une liste avec :
foreach $_(@ls) { print "élément " . $i++ . " $_/n"; }
pour les listes voir les fonctions foreach, while
une variable de hashage
est une variable qui contient une paire d'élément sous la
forme "clé" et "valeur". Ce qui est très pratique.
Les clés et valeurs peuvent être de n'importe quelle
nature.
Elle sont représentés par le signe % qui les
précédent.
exemple:
%s = ("poisson" => "sardine");
ou
$s{"poisson"} = "sardine";
une assignation:
assigné est le fait de donner une valeur à une variable,
le fait de convenir que telle variable ou autre bout de code contiendra
une valeur.
exemple:
$a = "bonjour"; # on assigne le mot bonjour, la valeur "bonjour" à la variable $aon peut le faire aussi avec une procédure, une routine, une fonction, un filehandle etc...
sub oui-non { if ($respond =~ /^o|y/) { return 1; } else { return 0; } }
la concaténation:
c'est le résultat d'une mise en forme calculé. exemple:
print "\nBonjour\n"
.
"
\t
le
monde
\n
";
qui donnera une fois interprété, puis ajouté bout
à bout:
Bonjour
le monde
Ici nous avons le signe
\n
(à
la
ligne retour chariot) puis
Bonjour
puis
\n
(à la ligne retour chariot) puis le
point
de concaténation
entre
deux
chaînes
entre guillemets
qui lies ces deux chaînes (on s'en sert
pour
couper plusieurs variable pour une meilleure lisibilité, (voir
plus
bas). Suivie de la deuxième chaîne
commençant par le signe
\t
(tabulation)
suivie des mots
le monde
suivie du
signe
\n
à la ligne, retour chariot .
exp: "$taf$a\n$b$taf" sera plus lisible écris comme ceci "$taf"
. "$a\n" . "$b" . "$taf"
On dit de deux chaînes ou fichiers ajouter l'un à l'autre
qu'ils sont concatenés.
Pour
savoir plus
.
filehandle
filehandle (
poignée
à fichier, qui sers à attraper un fichier
)
. Un
filehandle
est la représentation d'une source de donnée, il est
toujours
sous la forme d'une ou plusieurs lettres et/ou chiffre (ici F pour
File,
mais on aurai pu l'appelé MYWAY). On se sers d'un filehandle
pour
toute sortes de raisons, en fait chaque fois que l'on désigne
une
source de données, comme:
Pour ouvrir un fichier, auquel cas on en profite pour lui assigner
sa valeur (l'endroit qu'il désigne, ici "$dico" qui
représente
le fichier "dico_uk-fr" ):
open F, "$dico"# que l'on aurez pu écrire aussi:
open F, "dico_uk-fr"ou aussi:
open (F, "$dico") les 3 sont compris par Perl.Pour désigner le contenu du fichier:
@fichier = <F>;# se qui signifie que la variable liste @fichier a pour valeur tout le fichier, chaque ligne est un élément de la liste @fichier. Pratique non?
open (ouvre):
la fonction open suivie d'un filehandle de fichier ouvre un fichier. On
l'écrit comme ceci:
open F, "$dico" or die "Ouverture de $dico impossible $!";ou
open (F, "$dico") || die "Ouverture de $dico impossible $!";Perl l'interprétera comme:
"Ouverture de C:\doc\dico_uk-fr impossible"
.
open F, "> $dico" or die "Ouverture de $dico impossible $!";
On doit pensez aussi à prévoir les problèmes d'ouvertures et fermetures de fichiers, donc on oriente le <STDERR> vers la fermeture du script suivi d'un message explicatif (ici "Ouverture de $dico impossible "). Pensez à refermer vos fichier, sinon il reste ouvert pendant toute votre session, créant des problèmes et même des bugs sous Windows.
or ou ||: les opérateurs or et || représente le ou , si tel chose ne peut se faire les instructions après ou sont exécutés.
die (meurs) : arrête le script, fini et vide les variables.
C'est un éventail de propositions qui va permettre à l'utilisateur d'orienter le programme suivant son choix, ce choix ce fera par le traitement de la réponse de l'utilisateur. En général le menu est traité dans une même procédure. Presque tout les programmes ont le même cheminement qui ce fait soit par un toolbar (comme dans les programmes en VB), des boutons, des menus défilant ou de manière textuelle comme ici, le principe est le même, la réponse de l'utilisateur défini l'orientation du programme. Ici on attend un caractère suivi de la touche de confirmation Enter
La sous procedure est un script qui doit être lu
et interprété en entier avant de retourné
à la suite de votre script principal.
Les variables doivent être déclarées dans votre
script principal si vous voulez quelle puissent être pris en
compte
dans votre script principal car à l'intérieur de la sous
procedure elle sont prise en local (enfin juste pour la sous
procedure).
Si vous attendez une seule valeur vous pouvez la retourner au script
principal par:
return $var;et donc $var sera pris en compte.
sub nom_de_la_sous-procedure {
sub nom_de_la_sous-procedure($var) {
&oui-non($reponse);et la sous procedure ou fonction s'écrira:
sub oui-non($reponse) {
en Perl on construit un contrôle avec l'instruction if comme ceci:
if (expression) {instruction}
ou l'expression peut être :
$a == $b # c'est à dire que si $a est égale à $b c'est bon, valeur de retour 1, vrai, true.
$a != $b # c'est à dire que si $a est égale à $b c'est pas bon, valeur de retour 0, faux, false
et l'instruction peut être n'importe quoi, style:
next if /^\./;Ici l'instruction next qui signifie suivant est placée devant la condition if si l'element de recherche par defaut "$_" commence par un point ".".
(print "ca marche\n" and print "Je suis ravis de vous dire que ") if (2 = 1+1);Dans cet exemple on voit que l'on peut placer le block d'instruction devant mais aussi que l'interpreteur traitera le block de droite à gauche contrairement au sens commun de gauche à droite. Car l'écran affichera:
La fonction foreach sert comme sont nom l'indique à contrôler
tout les éléments d'une liste ou d'un hashage, un par un,
du premier au dernier. Ce contrôle ce presente sous la forme:
foreach $_(@_) {
Dans un conteste de liste l'espace d'entrée et de recherche de motifs par defaut sera $_
foreach (@liste_foot) { $i++; print " l'element n° $i est $_\n"; }affiche la liste des elements de @liste_foot sous la forme:
La fonction split sert à couper quelque chose est peu être utiliser de plusieurs façon. exemple:
($line, $exemple)= split(/\|/, $ligne);
d'abord la fonction split coupe, dissocie ce qui ce trouve en fin de
parhentése (ici $ligne) par ce qui ce trouve entre les deux
slash
(ici la barre droite '
|
' qui s'écrit "
/|
" pour ne
pas être interpréter pour un
OU
) et place
le résultàt réspéctivement dans
$line
et
$exemple
.
en français on pourrai lire cette ligne comme:
Place réspéctivement dans $line puis si il y a lieu dans
$exemple le résultàt du clivage de la ligne $ligne par le
caractère "|" et ceci au moyen de split.
On peut aussi ce servir de split comme ceci:
@caracteres = split($ligne);
ceci créera une liste de tout les caractère qui forme
la ligne $ligne.
Si on veut faire par mot on écrira :
@mots= split(/ /,@ligne);
while
L'instruction while (tant que) est trés pratique elle sert comme
sont nom l'indique à faire une ou plusieur chose (commande,
ligne de code, etc...)
tant que la condition est vrai.
l'interpréteur recommencera le BLOCK de command tant que la
condition sera vrai.
exemple:
while ($vous != $monchiffre) {
print "re-entrer un chiffre entre 1 et 9\n";
chomp ($monchiffre = <STDIN>);
}
Elle peut être suivie de l'instruction continu
réajoutant un BLOCK à la fin, mais nous verrons ca plus
loin.
#!/usr/bin/perl
#
************************************************************************
# for Linux and UNIX-Like
|
made by alain
Adelmar
*
# remd: petit logiciel de traduction de mot simple
anglais->français
*
# et vice verca ainsi qu'une option edit pour etoffer le
dico.
*
# Cette version peut aussi traduit un mot (anglais) en tant
qu'argument
*
# et repond sur une ligne. expl: taf append =>
continuer
*
# son fichier resource : dico_uk-fr (dico perso de quelques
kilos)
*
# Ce script tourne trop bien. Pour updater les dico_uk-fr =>
updico.pl
*
# alain adelmar 06/Juillet/2002~03/Decembre/2003.
version:
2.02b *
#*************************************************************************
system("clear");
# $dico = "\.\/dico_uk-fr"; # uncommant pour avoir
le dico dans le rep courant
# donc entrer ici la valeur de $dico (expl: $dico =
"\.\/dico_uk-fr";)
#$dico = "\/lago\/bin\/dico_uk-fr"; # placer le o vous
voulez ici (attention common ailleur)
$dico = "\/home\/common\/bin\/dico_uk-fr"; # placer
le o vous voulez ici
$x = "x*" x 28;
$donc = "\n\tdonc\n";
# 1er partie avec argument qui ne traite qu'un seul mot sur une
ligne.
if($ARGV[0] ne "") {
if ($ARGV[0] eq "-v") {
print "\ntaf vers: 1.05\n";
exec 'quoi taf';
die "$x\n";
}
elsif ($ARGV[0] =~ /^\"|\"$/) {
s/^\"()\"$/$1/;
$mota = $1;
}
else {
$mota = $ARGV[0];
}
$argv = 1;
&lire_dico;
&anglais_francais;
}
else {
print "\n$x\nVersion longue de taf (sans argument =
accᅵ au menu) *\nᅵnoter: Vous auriez pu
entrer
un mot a traduire en *\nguise d'argument, pensez y la
prochaine fois.
*\n
_ alain Adelmar
_
*\n$x\n";
$argv = 0;
}
# 2eme partie la commande sans argument qui ouvre le menu.
print "Bienvenu sur le petit traducteur
taf
*\n
aadelmar\@free.fr
*\n$x\n";
MENU:
print " _ Anglais-francais(1)\n _ Francais-anlais(2)\n _ Ajouter
quelques lignes au dico(3) \.\.\. reponse: ";
$trad = <STDIN>;
chomp $trad;
&lire_dico;
#menu possible de l'application**************************
if ($trad <= 1) {
print "$donc---- Anglais-francais ----\n\n";
$trad = "af";
&le_mot($mota);
&anglais_francais;
}
elsif ($trad == 2) {
print "$donc---- Francais-anglais ----\n";
$trad = "fa";
&le_mot($mota);
&francais_anglais($trad);
}
elsif ($trad >= 3) {
print "$donc---- Ajout au Dico perso ----\n";
print "Les lignes que vous ajoutez à votre dico
personnel\ndoivent
être
écritent:\nmot_anglais,mot_français1,mot_francais2,mot_français3|exemple_angl
= en_francais\n";
print "(ne laisser pas d'espace entre les mots, juste une
virgule)\n";
print "on y va? (o/n)\t";
$trad = "ed";
chomp ($repond = <STDIN>);
&oui_non($repond);
&edition;
}
print "\n$x\n";
print "tchao !!!\n$x\n";
sub anglais_francais {
while ($mota ne "quitte"){
foreach $ligne(@traduction) {
chomp($ligne);
# laisser comme ᅵ
car plus complet
if ($ligne =~ /^$mota/) {
($line, $exemple)= split(/\|/, $ligne);
($angl, $fr, $fr1, $fr2, $fr3) =split(/,/,
$line);
print "$angl = $fr\t$fr1\n";
if ($fr2 ne "") {
print "$angl = $fr2\t$fr3\n";
}
if ($exemple ne "") {
print "exemple: $exemple\n";
}
}
}
if ($argv == 0) {
&choix;
}
else { die "$x\n(Pas d'autre mot pour $mota)
$!"}
}
# print "tchao !!!\n";
}
sub francais_anglais($trad) {
while ($mota ne "quitte"){
foreach $ligne(@traduction) {
($line, $exemple)= split(/\|/, $ligne);
($angl, $fr, $fr1, $fr2, $fr3) = split(/,/, $line);
if ($fr =~ /^$mota/) {
print "$fr = $angl\n";
}
if ($fr1 =~ /^$mota/) {
print "$fr1 = $angl\n";
}
if ($fr2 =~ /^$mota/) {
print "$fr2 = $angl\n";
}
if ($fr3 =~ /^$mota/) {
print "$fr3 = $angl\n";
}
}
&choix;
}
# print "tchao !!!\n$x\n";
}
sub edition {
while(! oui_non($repond)) {
LABEL:print "\nEntrez votre ligne\n";
chomp ($ligne_in = <STDIN>);
($linei, $exemplei)= split(/\|/, $ligne_in);
($angli, $fri, $fr1i, $fr2i, $fr3i) =split(/,/,
$linei);
foreach $ligne(@traduction) {
($line, $exemple)= split(/\|/,
$ligne);
($angl, $fr, $fr1, $fr2, $fr3)
=split(/,/,
$line);
if ($angl eq $angli|| $fr eq $fri
) {
print "cette ligne présente des
similitudes
avec la ligne:\n";
print "$angl = $fr\t$fr1\t$fr2\t$fr3\t$exemple\n";
print "voulez vous quand même entrer votre
ligne dans le dico?\n";
$resp = <STDIN>;
chomp $resp;
if ($resp =~ /^n/i) {
print "elle ne sera donc pas
intégré
à votre dico\n";
goto LABELMENU;
}
}
}
$ligne_in = "$ligne_in" . "\n";
push @traduction, $ligne_in;
print "on continu? (o/n):\t";
chomp($repond = <STDIN>);
}
open(D, ">$dico") or die "Ouverture de dico impossible
$!";
print D @traduction;
close D or die "fermeture impossible $!";
print "Vos lignes ont été rajouté au
dictionnaire de traduction $dico\n";
&choix;
}
sub choix {
print "---------- (quitte) quitte, (menu) menu ou un autre
mot:\n";
$mota= <STDIN>;
chomp $mota;
if ($mota eq "menu") {
goto MENU;
}
}
sub le_mot($mota) {
print "entrer votre mot pour le traduire ou (menu) menu
ou (quitte) quitter)\n";
chomp ($mota = <STDIN>);
}
sub oui_non($repond) {
my ($repond) = @_;
$repond =~ tr/A-Z/a-z/;
if ($repond =~ /^o|y/) {
return 0;
}
elsif ($repond =~ /^n/) {
return 1;
}
else {
print "\a";
print "Veuillez repondre par Oui ou par non\n";
chomp ($repond = <STDIN>);
&oui_non($repond);
}
}
sub lire_dico {
#lecture du dico******************************************
open DATA, "$dico" or die "Ouverture de dico impossible
$!";
@traduction = <DATA>;
close DATA || die "fermeture impossible $!";
}
END;
Voici taf dans une version plus récente, elle fonctionne pour
Windows comme pour Linux et gére la date en Français.
Elle est aussi plus stable. Alain Adelmar
#!/usr/bin/perl # ************************************************************************ # for Linux and UNIX-Like | made by alain Adelmar * # remd: petit logiciel de traduction de mot simple anglais->français * # et vice verca ainsi qu'une option edit pour etoffer le dico. * # Cette version peut aussi traduit un mot (anglais) en tant qu'argument * # et repond sur une ligne. expl: taf append => continuer * # son fichier resource : dico_uk-fr (dico perso de quelques kilos) * # Ce script tourne trop bien. Pour updater les dico_uk-fr => updico.pl * # Ce script tourne sur tout environement (Linux - Windows - etc) à la * # condition que dico_uk-fr soit installé dans (le répértoire courant) ou * # les paths suivants: /home/common/bin ou ./bin pour Linux * # ou définissez votre propre path ligne 38 * # Requis le module Datefr.pm sinon mettre lignes 20 et 21 en commentaires* # alain adelmar 06/Juillet/2002~09/Mai/2006. version: 2.04 * #************************************************************************* #system("clear"); #use Datefr; #our $opt = 3; #our $mod_affichage = 5; #our $fd = maintenant($mod_affichage); use Cwd; my $dir = getcwd; if ($^O=~ /[msys|cygwin|gnu]$/) { $gnus++; print "this is a real gnu OS, congratulation\n"; } elsif ($ENV{"PATH"}=~ /^\//) { $gnus++; print "this is a real gnu OS, congratulation\n"; } my @gnul = ("\\", "\/"); my $gnup = $gnul[$gnus]; # @ds = split(/$gnup/, $d); # $ds = pop @ds; $pref = '/home/common/bin/dico_uk-fr'; if(-e $pref) { $dico = $pref; } else { $pref = "$dir$gnup" . "dico_uk-fr"; if (-e $pref) { $dico = $pref; } else { die "erreur de path, impossible a taf de trouver dico_uk-fr\nsolution: modifierz la ligne 53 de taf ou\ncopier le au bon endroit $!"; } } # donc entrer ici la valeur de $dico (expl: $dico = "\.\/dico_uk-fr";) # sinon placer le ou vous voulez en definissant un path correct dans la ligne suivante # $dico = "remplacer_cette_phrase_par_un_path"; $x = "x*" x 28; $donc = "\n\tdonc\n"; # 1er partie avec argument qui ne traite qu'un seul mot sur une ligne. if($ARGV[0] ne "") { if ($ARGV[0] eq "-v") { print "\ntaf vers: 1.05\n"; exec 'quoi taf'; die "$x\n"; } elsif ($ARGV[0] =~ /^\"|\"$/) { s/^\"()\"$/$1/; $mota = $1; } else { $mota = $ARGV[0]; } $argv = 1; &lire_dico; &anglais_francais; } else { print "\n$x\nVersion longue de taf (sans argument = accés au menu) *\n"; print "A noter: Vous auriez pu entrer un mot a traduire en *\n"; print "guise d'argument, pensez y la prochaine fois. *\n"; print " _ alain Adelmar _ *\n$x\n"; $argv = 0; } # 2eme partie la commande sans argument qui ouvre le menu. print "Bienvenu sur le petit traducteur taf *\n"; print " aadelmar\@free.fr *\n$x\n"; MENU: print " _ Anglais-francais(1)\n _ Francais-anlais(2)\n _ Ajouter quelques lignes au dico(3) \.\.\. reponse: "; $trad =; chomp $trad; &lire_dico; #menu possible de l'application************************** if ($trad <= 1) { print "$donc---- Anglais-francais ----\n\n"; $trad = "af"; &le_mot($mota); &anglais_francais; } elsif ($trad == 2) { print "$donc---- Francais-anglais ----\n"; $trad = "fa"; &le_mot($mota); &francais_anglais($trad); } elsif ($trad > = 3) { print "$donc---- Ajout au Dico perso ----\n"; print "Les lignes que vous ajoutez à votre dico personnel\ndoivent être écritent:\n"; print "mot_anglais,mot_français1,mot_francais2,mot_français3|exemple_angl = en_francais\n"; print "(ne laisser pas d'espace entre les mots, juste une virgule)\n"; print "on y va? (o/n)\t"; $trad = "ed"; chomp ($repon = ); &oui_non($repon); &edition; } print "\n$x\n"; print "tchao !!!\n$x\n"; sub anglais_francais { while ($mota ne "quitte"){ foreach $ligne(@traduction) { chomp($ligne); # laisser comme ca car plus complet if ($ligne =~ /^$mota/) { ($line, $exemple)= split(/\|/, $ligne); ($angl, $fr, $fr1, $fr2, $fr3) =split(/,/, $line); print "$angl = $fr\t$fr1\n"; if ($fr2 ne "") { print "$angl = $fr2\t$fr3\n"; } if ($exemple ne "") { print "exemple: $exemple\n"; } } } if ($argv == 0) { &choix; } else { die "$x\n(Pas d'autre mot pour $mota) $!"} } # print "tchao !!!\n"; } sub francais_anglais($trad) { while ($mota ne "quitte"){ foreach $ligne(@traduction) { ($line, $exemple)= split(/\|/, $ligne); ($angl, $fr, $fr1, $fr2, $fr3) =split(/,/, $line); if ($fr =~ /^$mota/) { print "$fr = $angl\n"; } if ($fr1 =~ /^$mota/) { print "$fr1 = $angl\n"; } if ($fr2 =~ /^$mota/) { print "$fr2 = $angl\n"; } if ($fr3 =~ /^$mota/) { print "$fr3 = $angl\n"; } } &choix; } # print "tchao !!!\n$x\n"; } sub edition { while(! oui_non($repon)) { LABEL:print "\nEntrez votre ligne\n"; chomp ($ligne_in = ); ($linei, $exemplei)= split(/\|/, $ligne_in); ($angli, $fri, $fr1i, $fr2i, $fr3i) =split(/,/, $linei); foreach $ligne(@traduction) { ($line, $exemple)= split(/\|/, $ligne); ($angl, $fr, $fr1, $fr2, $fr3) =split(/,/, $line); if ($angl eq $angli|| $fr eq $fri ) { print "cette ligne présente des similitudes avec la ligne:\n"; print "$angl = $fr\t$fr1\t$fr2\t$fr3\t$exemple\n"; print "voulez vous quand même entrer votre ligne dans le dico?\n"; $resp = ; chomp $resp; if ($resp =~ /^n/i) { print "elle ne sera donc pas intégré à votre dico\n"; goto LABELMENU; } } } $ligne_in = "$ligne_in" . "\n"; push @traduction, $ligne_in; print "on continu? (o/n):\t"; chomp($repon = ); } open(D, ">$dico") or die "Ouverture de dico impossible $!"; print D @traduction; close D or die "fermeture impossible $!"; print "Vos lignes ont été rajouté au dictionnaire de traduction $dico\n"; &choix; } sub choix { print "---------- (quitte) quitte, (menu) menu ou un autre mot:\n"; $mota= ; chomp $mota; if ($mota eq "menu") { goto MENU; } } sub le_mot($mota) { print "entrer votre mot pour le traduire ou (menu) menu ou (quitte) quitter)\n"; chomp ($mota = ); } sub oui_non($repon) { my ($repon) = @_; $repon =~ tr/A-Z/a-z/; if ($repon =~ /^o|y/) { return 0; } elsif ($repon =~ /^n/) { return 1; } else { print "\a"; print "Veuillez repondre par Oui ou par non\n"; chomp ($repon = ); &oui_non($repon); } } sub lire_dico { #lecture du dico****************************************** open DATA, "$dico" or die "Ouverture de dico impossible $!"; @traduction = ; close DATA || die "fermeture impossible $!"; } END;