Exemple commenté

alain Adelmar
aadelmar@numericable.fr beuuh c est quoi ca

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é

  • taf ---- comme ----> Traducteur Anglais- Français.
  • 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.

    alain

    Se faire son propre traducteur Anglais-Français:

    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?


    en haut ^
    -----------------------------------------

    En gros que va faire ce programme ?

    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).

    en haut ^

    Code couleur de cet exemple:

    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é

    Et toute les 10 lignes je récapitulerai en réécrivant l'ensemble des 10 lignes sans commentaires. Si quelque chose vous échappe ou vous laisse pérplexe... écrivez moi aadelmar@numericable.fr

    mais aussi toute chose importante _ _ _ _ _ _ en bleu
    le code_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ code rouge sur orangé


    Les rernvois

    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...

    et maintenant voici le script expliqué ligne par ligne, et mot par mot.

    Le code

    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 -w
      	
    alors que pour Windows il sera comme ça:
      	  01  #!perl -w
      	
    info :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çais
            
    A 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:

  • $a = $b = $c =0;   # qui signifie que $a est égale a $b et a $c est vaut 0.
  • 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:

  • close F, "$dico" or die "fermeture de $dico impossible $!";
  • 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:

    donc si nous avions

    $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*
    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*



      	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):

    Bienvenue  sur le petit traducteur tafed
    offert par a_l_a_i_n // a_d_e_l_m_a_r aadelmar@free.fr
    Anglais-français(1)
    Français-anglais(2)
    Ajouter quelques lignes au dico(3)       réponse:

    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:

  • chomp($trad = <STDIN>);
  • 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 suite
      	01 #!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:
    af          pour anglais français
    donc il est possible de changé une valeur en cour de route, et oui, c'est des variables donc variables, pas constantes.
    maintenant $trad vaut "af" si l'utilisateur a entrer 1 ou rien (par défaut).  (nous somme toujours dans le bloc de if ($trad<=1) {)

      	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:

    ou comme ça : 
    ou plus exactement:

      	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 $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

    chomp ($repond = <STDIN>);

    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:

    car la variable $_ était implicitement appelé et elle représente par defaut l'element de la liste que nous etudions.
    De même on aurai tres bien pu écrire les deux dernières lignes comme ceci:

      	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"

    voir pour plus d'ample détails split, taper à la console: perldoc -f split

      	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 () sera nettoyer de sa fin de ligne.

      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 $!"
      
    ce qui signifie
      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:
    close D; ... ou ... close D || die "erreur $!"; ,
    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).
    Oui, si il veut continue en entrant une autre traduction, un simple Enter suffira.

      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.

    en haut ^


    lexique:

    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.

    variable liste ou tableau:

    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");
      

    ou
    $s[0] représentera l'élément "s"
    $s[1] représentera l'élément "a"
    etc... jusqu'à
    $#s[-1] qui représentera le dernier élément "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

    variable de hashage:

    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 $a
      
    on peut le faire aussi avec une procédure, une routine, une fonction, un filehandle etc...
    exemple: while (! oui-non) {  # qui veut dire tant que la procédure oui-non sera fausse faite

      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:
    Ouvre F, qui représente 'C:\doc\dico_uk-fr' ou arrête tout en affichant l'erreur "Ouverture de C:\doc\dico_uk-fr impossible".
    Si l'on avait voulu ouvrir le même fichier mais en (lecture - écriture) on l'aurai indiqué en ajoutant le signe > devant $dico comme:
      open F, "> $dico" or die "Ouverture de $dico impossible $!";
      

    auquel cas on pouvaient écrire dedans.

    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 logique et xor ou exclusif

    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

    die (meurs) : arrête le script, fini et vide les variables.

    le menu c'est quoi?

    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 procédures

    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.
    Pensez aussi à la portée des variable surtout si votre sous procedure ce trouve sur un autre fichier.
    Je ne connais pas bien la différence entre la fonction et la sous procedure, sinon que la sous procedure commence toujours par
    " sub " comme ceci:
      sub nom_de_la_sous-procedure {
      

    ou lorsqu'on veux passer une variable
      sub nom_de_la_sous-procedure($var) {
      

    Je vais me renseigner  puis rectifierai ce qui est à rectifier (mais ça fonctionne très bien comme ça).
    En régle générale vous pouvez passer des variables avec une sous procedure, mais je crois que ca s'appelle fonction enfin peu importe, on peut comme ceci:
    exemple:
    l'appel ce fera comme :
      &oui-non($reponse);
      
    et la sous procedure ou fonction s'écrira:
      sub oui-non($reponse) {
      

        my $reponse= _$;
        # permettant ainsi de passer tout un tas de type de variable possible.
    c'est trés pratique.

    if ou le test logique en Perl:

    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:

             { &beCbien($je_suis_ravi, $pour_vous)} ou { print "Hi World\n\tYou So Great\n" }
    ou
            {
               print "Le prochain coup ça passera pas\n";
              $b--;      # |8O°) ho!             /^\$/ humour/
                }


    Ou l'on peut aussi placer le block d'instruction devant comme:
      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 ".".
    On peut passer plusieurs instructions avant la fonction conditionnelle if. comme:
      (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:
    > Je suis ravis de voir que ca marche

    foreach

    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: l'element n°1 est Bordeaux

    split

    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.



    Le script en entier ci dessous dans sa première version:
     

    #!/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;


    Nouvelle version de Taf

    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;
      
      
    retour en haut de page   |  retour au debut du script  retour au debut de l'exo commenté | retour au debut des renvois