pluriTAL – BLOG Master pluriTAL [ParisX, ParisIII, INALCO]

Questions sur Perl

Posted in pluriTAL by pluritaluser on 21 mars 2009

Quelle est la différence entre l’assignation et le égal ?

$var1.= 11;
print "$var1\n";
$var2 = 22;
print "$var2\n";

Françoise Del Socorro

—————————————————————-

Françoise

Recopiez ce bout de code dans un fichier et lancez le script :

#cette première ligne définit une variable scalaire (de type chaîne de caractères)
# on créé la variable $var1 et on lui assigne une valeur (=)
$var1="a";

# on l'affiche
print "Valeur initiale de \$var1 : $var1\n";

# l'opération . est une opération de concaténation de chaîne de caractère,
#la notation .= est équivalente à $var1 = $var1 . "a";
$var1.="a";
print "Valeur modifiee de \$var1 : $var1\n";

# ici, l'opération . (qui travaille sur des chaînes de caractères) va
#concaténer "aa" à la chaîne "11"
$var1.=11;
print "Valeur modifiee de \$var1 : $var1\n";

Execution du script

SF

_____________________________________________________________________________________________

Merci Mr Fleury, j’ai compris que .= signifie la concaténation avec ce qu’on avait déjà mémorisé dans la variable.

Mais je vais poser + de questions sur le blog, mes camarades peuvent aussi répondre:

Question 1:

print "tape le premier numéro\n";
read ($premier_n);
print "tape le deuxieme numéro\n";
read ($deuxieme_n);
$troisieme_n = $premier_n + $deuxieme_n;
print "la somme de", $premier_n, " et ", $deuxieme_n, " est ", $troisieme_n, " \n ";

Pourquoi ça ne fonctionne pas ?

Réponse à la question 1

En Perl, les données « arrivant par le clavier »  sont disponibles par le descripteur <STDIN> (l’entrée standard).

De cette façon, on peut récupérer ce que l' »‘utilisateur »  tape au clavier :

$var = <STDIN>

L’expression «$var = <STDIN>;» signifie : affecter à la variable $var la suite de caractères

terminée par un caractère de saut de ligne à partir du fichier d’entrée standard STDIN (i.e la clavier).

Parfois il est nécessaire de supprimer le caractère \n récupéré lors de ce type d’affectation,

pour le supprimer on utilise par exemple la fonction chomp.

Compléments  en ligne :

Ce qui donne pour votre programme :

print "Entrez le premier nombre : ";
$premier_n=<STDIN>;
chomp($premier_n);
print "(la premier nombre lu est : $premier_n)";
print "\nEntrez le second : ";
$deuxieme_n=<STDIN>;
chomp($deuxieme_n);
print "(le second nombre lu est : $deuxieme_n)";

$troisieme_n = $premier_n + $deuxieme_n;
print "\nLa somme de ", $premier_n, " et de ", $deuxieme_n, " est ", $troisieme_n, " \n ";

Exécution :

test2

Question 2 (envoyée par e-mail, mais si vous répondez, je collerais la réponse sur le blog):

print"Tapez a pour avoir le produit de var 1 = 33 et var 2 = 44,
b pour avoir le produit de var 1 = 33 et var 3 = 55,
p12 pour permuter var1 et var2, p13 pour permuter var1 et var3,
p23 pour permuter var2 et var3, p0 pour remettre les variables à leur place.\n";

$var1 = 33;
$var2 = 44;
$var3 = 55;

$a .= ($produit=$var1*$var2); # erreur
$b .= ($produit=$var1*$var3); # erreur
$p12 .= ($var1.=$var2); # erreur
$p13 .= ($var1.=$var3); # erreur
$p23 .= ($var2.=$var3); # erreur

if $x="a" {print "$a\n"}; # erreur
if $x="b" {print "$b\n"}; # idem
if $x="p12" {$var1=$p12; print "var1=$var1\n"};
if $x="p13" {$var1=$p13; print "var1=$var1\n"};
if $x="p23" {$var2=$p23; print "var2=$var2\n"};
if $x="p0" {$var1 = 33; $var2 = 44; $var3 = 55; print "var1=$var1, var2=$var2, var3=$var3"};

Pourquoi ça ne fonctionne pas ?

Réponse à la question 2

print "Tapez votre choix : \na pour avoir le produit de var 1 = 33 et var 2 = 44,\n
b pour avoir le produit de var 1 = 33 et var 3 = 55,\n
p12 pour permuter var1 et var2,\n p13 pour permuter var1 et var3,\n
p23 pour permuter var2 et var3,\n p0 pour remettre les variables à leur place.\n
Votre choix :";
$choix=<STDIN>;
chomp($choix);

$var1 = 33;
$var2 = 44;
$var3 = 55;

if ($choix eq "a") {
      $produit1=$var1*$var2;
      print "Choix $choix : $produit1 \n";
}
elsif ($choix eq "b") {
      $produit2=$var1*$var3;
      print "Choix $choix : $produit2 \n";
}
elsif ($choix eq "p12") {
      $tmp1=$var2;
      $var2=$var1;
      $var1=$tmp1;
      print "Choix $choix : VAR1 : $var1 VAR2 : $var2 \n"
}
elsif ($choix eq "p13") {
      $tmp2=$var2;
      $var2=$var3;
      $var3=$tmp2;
      print "Choix $choix : VAR2 : $var2 VAR3 : $var3 \n"
}
else {
      print "Choix $choix : à vous de jouer pour traiter les autres cas...\n";
}

Je n’ai pas traité tous les cas de figure… A vous de jouer !!!

Exécution actuelle :

test3

——————————————————————————————————————–

Question 3

Décidement, j’ai énormément du mal avec Perl, est-ce que vous ou un camarade peut me corriger cela ? Cela sert à remplacer les accents automatiquement dans les pages web qu’on fait, cygwin accepte mon programme, mais il y a un petit problème: le fichier de sortie est vide.

Pour les balises <br> j’utilise PSPad Editor parce que là il y en a trop, mais comme je n’ai jamais utilisé d’éditeur HTML, je ne sais pas où cliquer pour le reste et donc je préfère faire le programme.

#/usr/bin/perl
print "Le fichier html bien accentue se nomme fichier-accentue.html";
open (FILEIN,"$FILE");
open (FILEOUT,">fichier-accentue.html");
$recup=~s/&agrave;/à/g;
$recup=~s/&aacute;/á/g;
$recup=~s/&acirc;/â/g;
$recup=~s/&atilde;/ã/g;
$recup=~s/&auml;/ä/g;
$recup=~s/&aring;/å/g;
$recup=~s/&aelig;/æ/g;
$recup=~s/&egrave;/è/g;
$recup=~s/&eacute;/é/g;
$recup=~s/&ecirc;/ê/g;
$recup=~s/&euml;/ë/g;
$recup=~s/&egrave;/è/g;
$recup=~s/&eacute;/é/g;
$recup=~s/&ecirc;/ê/g;
$recup=~s/&euml;/ë/g;
$recup=~s/&igrave;/ì/g;
$recup=~s/&iacute;/í/g;
$recup=~s/&icirc;/î/g;
$recup=~s/&iuml;/ï/g;
$recup=~s/&ograve;/ò/g;
$recup=~s/&oacute;/ó/g;
$recup=~s/&ocirc;/ô/g;
$recup=~s/&otilde;/õ/g;
$recup=~s/&ouml;/ö/g;
$recup=~s/&ugrave;/ù/g;
$recup=~s/&uacute;/ú/g;
$recup=~s/&ucirc;/û/g;
$recup=~s/&uuml;/ü/g;
$recup=~s/&ccedil;/ç/g;
$DUMPFULLtxt.=$recup;
print FILEOUT $DUMPFULL;
close (FILEOUT);
close (FILEIN);

Réponse à la question 3

Rien à signaler dans le code précédent SAUF que nous ne voyons pas où vous récupérez la variable $recup

ni le contenu de la variable $FILE sensée contenir le « nom physique » du fichier en entrée.

Si je comprends bien (mais c’est pas sûr), vous devez lire le fichier FILEIN et convertir les entités HTML

présentes dans ce fichier sous leur forme « classique de caractère accentué » et réécrire la chaîne modifiée

dans FILEOUT.

D’autre part, êtes-vous sûre de vouloir créer en sortie un fichier HTML ?

Car dans ce cas, pourquoi convertir les entités ?

Parce que depuis que j’ai découvert Notepad++ et Options des dossiers et de Recherche > ne pas masquer les extensions des fichiers dont le type est connu, pour créer une page html, je crée une page html vide et j’écris dedans, donc j’aurai même préféré rechercher et remplacer les accents dans la page html que je suis en train d’éditer sans faire de brouillon, mais là il vaut mieux sauvegarder sous fichier-accentue.html par prévention, mais ce n’est pas utile. Je vais encore tester votre correction et si ça marche bien, comme je ne remplace pas les balises, je mettrais à la place de fichier-accentue.txt, $FILE en espérant actualiser ma page en cours d’édition. Cela peut paraître bizarre mais comme les fichiers texte oublient fréquemment ce qu’on a tapé dedans, je pense que ne pas utiliser leur extension, est tout aussi utile. Françoise

Il manque donc a priori la boucle de lecture du fichier FILEIN et  :

#/usr/bin/perl
print "Le fichier html bien accentue se nomme fichier-accentue.html";
$FILE="fichier_en_entree";
open (FILEIN,"$FILE");
open (FILEOUT,">fichier-accentue.txt");
my $DUMPULL="";
while(my $recup=<FILEIN>) {
          # 1. transcodage
          $recup=~s/&agrave;/à/g;
          $recup=~s/&aacute;/á/g;
          $recup=~s/&acirc;/â/g;
          #etc...
          # 2. memorisation dans DUMPFULL
          $DUMPFULLtxt.=$recup;
}

print FILEOUT $DUMPFULL;
close (FILEOUT);
close (FILEIN);


Publicités

Laisser un commentaire

Choisissez une méthode de connexion pour poster votre commentaire:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :