Quelques exemples de code Perl

home
retour

Quelques exemples

<< retour aux chapitres du tuto

Passer un fichier texte en majuscules

Le fichier texte à passer en majuscule doit s'appeler fic_in.txt

le fichier résultat s'appelle fic_out.txt

les 3 fichiers passer_en_maj.bat, passer_en_maj.pl et fic_in.txt doivent se trouver dans le même répertoire

fichier passer_en_maj.bat
c:\perl\bin\perl.exe -w passer_en_maj.pl <fic_in.txt >fic_out.txt


fichier passer_en_maj.pl
map({tr/[a-z]/[A-Z]/; print;} (<>));

reste à double-cliquer sur passer_en_maj.bat

Affichage d'un fichier texte aux environs d'un certain n° de ligne saisi

Eventuellement utile pour le debuggage mais surtout comme tutorial

fichier No.pl
################### EDITION DES LIGNES AVEC LE NUMERO ###################

# ===============================================================
#                                                      CONSTANTES
$fic = "no.pl";    # fichier source
$ecart = 10;       # on affiche 10 lignes avant et 10 lignes apres
                   # la ligne demandee

# ==============================================================
#                                                           MAIN
open (IN,$fic)
  || die "\n\nimpossible d'ouvrir le fichier specifie : $fic\n\n";
@IN = <IN>; close IN;

$invite  = "\n\n\n
 ---------------------------------------------------------------------
 |                                                                   |
 | saisissez le no de ligne du fichier a afficher                    |
 |                                                                   |
 |                    saisissez n'importe quelle lettre pour quitter |
 |                                                                   |
 ---------------------------------------------------------------------
";
print $invite;

# on attend que soit saisi sur la console un ou plusieurs chiffres
while(defined($noLig = <>) && ($noLig =~ /[0-9]+/))
{
  chomp $noLig;      # suppr de la touche 'entree' apres la saisie des chiffres
  print " --------";

  for ($i = $noLig-$ecart; $i < $noLig+$ecart; $i++)
  # pour chaque ligne comprise entre le no de ligne saisi moins l'ecart
  #  et le no de ligne saisi plus l'ecart
  {
    $aff = sprintf("%- 4d", $i);            # formatage de la marge affichant le no de ligne
    $out = !$IN[$i-1] ? "\n" : $IN[$i-1];
    chomp $out;
    if ($i == $noLig)
    {
      print "\n |$aff>>| $out";
    }
    elsif ($i-1 >= 0)
    {
      print "\n |$aff  | $out";
    }
  }
  print "
 |      |
 --------";

  print $invite;
}


Création d'un index en html

Vous avez une liste de pages html dans un répertoire et vous voudriez créer un index (style navigateur avec les liens à gauche)
la page principale s'appelle "index.html"
la page generée s'appelle "_indexGenere.html"

on utilise les frames pour éviter de fermer la page à chaque fois(sinon ya plus grand interêt)
la page principale est séparée en 2 frame :

fichier index.html
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>INDEX</title>

    <!-- une frame sur 2 colonnes, celle de gauche fait 200 pixels de large -->
    <frameset border="0" cols=200,*>

      <!-- la frame de gauche s'appelle menu et affiche _indexGenere.html -->
      <frame name="menu" src="./_indexGenere.html" />

      <!-- la frame de droite s'appelle data et n'affiche rien pour l'instant -->
      <frame name="data" />

    </frameset>

  </head>
</html>

fichier genererLiens.bat
rem on recupere les noms de fichiers voulus : html, htm, php et on stocke le resultat dans le fichier res.txt
dir /A:-D /B *.htm* >res.txt
dir /A:-D /B *.php >>res.txt

rem le script perl recoit en entree le fichier res.txt et genere en sortie le fichier _indexGenere.html
c:\perl\bin\perl.exe -w generLiens.pl < res.txt >_indexGenere.html
del res.txt

fichier genererLiens.pl
# en une seule ligne !!!
# on ecrit :
#  - le debut de la page html
#  pour chaque element de <> c'est a dire pour chaque ligne du fichier en entree
#  - on cree le lien
#      la reference est le nom du fichier dont on a supprime le retour chariot
#      la target est 'data' (nom de la frame de droite)
#      le nom du lien reprend le nom de la page sans l'extension
#  - la fin de la page html

print ("<html><body>",
map("<a href='${\(s/\n//,$_)}' target='data'>${\(s/(\.htm[l]?)?|(\.php)?$//g,$_)}</a><br />\n",<>),
"</body></html>");


Création d'un index d'image (galerie photo) en html

fichier generer_index_jpg.bat
perl -w generer_index_jpg.pl
pause


fichier generer_index_jpg.pl
#--------------------------------------------------------------------------------
#                                                            COURT RESUME DU TRUC
# on boucle sur chq image du reperoire
#   generation du code html de l'image dans le buffer
#   si no photo en cours est multiple du nbr de photos par page
#       -> ecriture du buffer ds fichier
# fin boucle
# si le dernier no de photo n'est pas multiple du nbr de photos par page
#     -> ecriture du buffer ds fichier : derniere page

#--------------------------------------------------------------------------------
#                                                             CONSTANTES A SAISIR
$CHEMIN_REPERTOIRE = ".";      # ne pas modifier
$NBR_COL_PHOTO = 3;            # nombre de photos par colonne par page
$NBR_LIG_PHOTO = 3;            # nombre de photos par ligne par page
$NOM_PAGE_WEB = "index";       # racine du nom des pages generees
$NOM_EXTENSION_PAGE = ".html"; # extension du nom des pages generees

#--------------------------------------------------------------------------------
#                                                                      CONSTANTES
$DEBUT = ("<html><body>\n");
$scriptjs = "
<script language='javascript'>
<!--
function aff(pho){
  wndw =\"\";
  wndw = window.open(\"\",\"\",";
$scriptjs .= "\"alwaysRaised=1,dependent=1,hotkeys=0,location=0,";
$scriptjs .= "menubar=0,status=0,titlebar=0,toolbar=0\");
  wndw.document.writeln(\"<html><body>
  <img src='\"+ pho + \"'></body></html>\");
}
-->
</script>\n";
$tabdeb = ("<table>\n");
$tabfin = ("\n</table>\n");
$FIN = ("\n</body></html>");
$coldeb = "<td style=\"border-style:solid;border-width:1px\">\n";
$colfin = "</td>\n";
$ligdeb = "<tr>\n<td style=\"border-style:solid;border-width:1px\">\n";
$ligfin = "</td>\n</tr>\n";

#--------------------------------------------------------------------------------
#                                                    INITIALISATION DES VARIABLES
$out = "";      # buffer
$noPhoto = 0;   # photo en cours
$noPage = 1;    # page en cours
$nbrMaxPhoto = $NBR_COL_PHOTO * $NBR_LIG_PHOTO;

#--------------------------------------------------------------------------------
#                                                                            MAIN
 # contenu du repertoire dans la liste @LIST
opendir(DIR,$CHEMIN_REPERTOIRE); @LIST = readdir DIR; closedir DIR;

 # fichiers de @LIST se terminant par '.jpg' dans la liste @jpg
@jpg = grep(/\.jpg$/i,@LIST);
 # fichiers de @LIST se terminant par '.gif' dans la liste @gif
@gif = grep(/\.gif$/i,@LIST);
 # fichiers de @LIST se terminant par '.png' dans la liste @png
@png = grep(/\.png$/i,@LIST);

@imgs = (@jpg,@gif,@png);

 # recuperation du nombre d'elements de la liste @imgs dans $nbTot
$nbTot = @imgs;

 # pour chaque element de @imgs (<=> chaque fichier image)
foreach $img(@imgs)
{
  # traitement cas changement de ligne
  $deb = $coldeb;
  $deb = $ligdeb if($noPhoto % $NBR_COL_PHOTO == 0);
  $noPhoto++;
  $fin = $colfin;
  $fin = $ligfin if($noPhoto % $NBR_COL_PHOTO == 0);

  # ajout au buffer de la ligne de l'image en cours
  $out .= $deb ."<table><tr><td><a href='#' onClick='javascript:aff(\"$img\");'><img src='$img' width='128' height='96'></td></tr><tr><td>$img</td></tr></table>\n".$fin;

  # cas nouvelle page html : traitement des liens page suivante et precedente
  if($noPhoto % $nbrMaxPhoto == 0)
  {
    $pr =  $noPage - 1;
    $su =  $noPage + 1;
    $lienP = "";
    $lienP = "<a href='".$NOM_PAGE_WEB. $pr . $NOM_EXTENSION_PAGE. "'>prev</a>" if($pr > 0);
    if($noPhoto == $nbTot)
    {
      $lienS = "";
    }
    else
    {
      $lienS = "<a href=\'".$NOM_PAGE_WEB. $su . $NOM_EXTENSION_PAGE ."'>next</a>" ;
    }

    # ecriture dans le fichier resultat
    open (OUT, ">". $NOM_PAGE_WEB.$noPage.$NOM_EXTENSION_PAGE);
    print OUT $DEBUT.$scriptjs.$lienP.$tabdeb.$out.$tabfin.$lienS.$FIN;
    close OUT;
    $out = ""; # RAZ du buffer
    $noPage++; # inc du no de page
  }
}
 # trt de la derniere page
if($noPhoto % $nbrMaxPhoto != 0)
{
  $pr =  $noPage - 1;
  $lienP = "";
  $lienP = "<a href='".$NOM_PAGE_WEB. $pr . $NOM_EXTENSION_PAGE ."'>prev</a>" if($pr > 0);

  # ecriture dans le fichier resultat
  open (OUT, ">". $NOM_PAGE_WEB.$noPage.$NOM_EXTENSION_PAGE);
  print OUT $DEBUT.$scriptjs.$lienP.$tabdeb.$out.$tabfin.$FIN;
  close OUT;
}


<< retour aux chapitres du tuto



Document made with Nvu

Valid HTML 4.01 Transitional