Exemple 2

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

Petit programme de quelques lignes qui extrait tout les liens internet d'un quelconque fichier.
Voilà une des innombrables façon de procéder:

  #!/usr/bin/perl -w
  # remd: recherche de tout les liens internet d'un fichiers. alain adelmar
  
  print "Entrez le nom du fichier duquel vous voulez extraire les liens internet:\n";
  $fil6t = <STDIN>;
  
  open FIL6T,"<$fil6t" or die "impossible d'ouvrir le fichier cité: $!";
  @contenu = <FIL6T>;
  close FIL6T or die "Erreur fermeture: $!";
  
  foreach $ligne(@contenu) {
    if ($ligne =~ /http:|ftp:|mailto:/) {
    print "$ligne";
      }
    next;
    }
  END;
  

Qui peut s'expliquer (ligne par ligne) en disant:

(ligne1) Ceci est un programme perl est il doit être exécuté en vérifiant les erreurs éventuelles
(ligne2) commentaire avec remd: (totalement superflu, mais pratique quand on ne sait plus quel prog fait quoi)
(ligne3) vide
(ligne4) Demande à l'utilisateur d'entrer le nom du fichier
(ligne5)Le mot qu'il te donne est le nom du fichier, range le dans une variable sous le label $fil6t
(ligne6) vide
(ligne7)ouvre le fichier cité en lecture ou tilt en avertissant de l'erreur rencontré
(ligne8)place le contenu du fichier dans une variable liste, appelé @contenu
(ligne9)tu peu fermer le fichier (j'ai le contenu dans @contenu), si problème prévient de l'erreur
(ligne10) vide
(ligne11)pour chaque ligne du contenu
(ligne12)si la ligne contient une chaîne de caractère "http:","ftp:" ou "mailto:"
(ligne13)affiche la ligne
(ligne14)ferme le block if au dessus (par l'accolade fermante)
(ligne15)suivant
(ligne16)quand c'est fini ferme la boucle (foreach)
(ligne6)fin du script

On aurai bien sûr put envoyer toute ces lignes dans un fichier, il suffisait de définir un fichier, stocker le résultat dans une autre variable tableau, ouvrir écrire le contenu et fermer. Voilà c'est aussi simple que ça et même plus encore. Voici le même programme mais plus bref:

#!/usr/bin/perl -w
# remd: script pour extraire tout liens extérieurs d'un fichier html.

print "Entrez le nom du fichier à traiter:\t";
$filout = <STDIN>;

open FH, $filout or die "impossible d'ouvrir ce fichier: $!";
while (<FH>) {
 print if /http:/;
 print if /ftp:/;
 print if /mailto:/;
}
close FH or die "error fermeture: $!";

En général pour ce type de programme, on défini les variables ( en leurs donnant un nom), on ouvre tel ou tel fichier, on stocke les valeurs dans une variable, on ferme le fichier et on applique le processus qui tri, compare, cherche, extrapole, modifie ou tout ensemble et on restitue le résultât sur la sortie standard (<STDOUT>) ou dans un fichier (ouvrir, écrire fermer).

Et maintenant un autre exemple pour ce faire une idée, voilà vous avez un fichier (.html) du style:

<TD>abo.wanadoo.fr</TD>
<TD>852</TD>
<TR>
</TR>
<TD>salagri.image.fr</TD>
<TD>274</TD>

etc... vous voulez oter les tags HTML et les lignes vides de manière à avoir une liste des server sur un fichier texte.
Voilà j'appellerai ce script "otag.pl", le fichier .html source s'appelle "locdom.html" et voici une façon de le faire (version longue):
Soit en deux fois comme:

#!/usr/bin/perl -w
# remd: preparation de liste en extrayant les balises (.html). alain adelmar sept2000.

$listea = "lsbagdom.html";       # définir le fichier source par une variable.
$listeb = "lslblserv.txt";       # définir le fichier qui recevra la liste finale.

open LSA, $listea or die "Error: pbOpSrc $!";   # ouverture du handle ou message erreur.
@contenu = <LSA>;                 # placer le contenu du fichier dans une variable liste.
close LSA or die "Error pbShutSrc $!";    # fermer le fichier puisque l'on a stocké @contenu.

@nwcontenu = <LSB>;           # on défini, assigne et initialise la variable liste qui
                               # contiendra le résultat souhaité avant de s'en servir.

foreach $ligne (@contenu) {     # pour chaque $ligne du @contenu faire ...
 next if length $ligne <= 6;    # aller à la ligne suivante si le nombre de caractere <=6
 $s1 = $ligne;                 # je defini une variable comme instance de $ligne.
 $s1 =~ s/<TD\>//;              # auquel je substitue la balise <TD>.
 push @contenu_moins_tagin, $s1;    # je pousse le résultât de la substitution ($s1) dans une
                                    # variable liste @contenu_moins_tagin.
}

foreach $s1 (@contenu_moins_tagin) {    # pour chaque $s1 du @contenu_moins_tagin
 $s2 = $s1;                           # défini $s2 (une autre instance de $s1)
 $s2 =~ s/()<\/TD\>//;               # et la je substitue la balise fermante </TD> de $s2
 print "Je traite la ligne: $s2\n";    # printe le résultat avant de le pousser dans
 push @nwcontenu, $s2;                 # @nwcontenu
}

open(LSB, ">$listeb") or die "Error pbOpenCible $!";  # ouvre le fichier cible (.txt).
print LSB @nwcontenu;               # écrit la liste dans le fichier cible.
close LSB or die "Error pbShutCible $!";    # ferme ou dit ce qui cloche
END;                                       # that all folks.

soit en une fois comme:

#!/usr/bin/perl -w
# remd: preparation de liste. adelmar alain

$listea = "lsbagdom";
$listeb = "lslblserv.txt";

open LSA, $listea or die "Error: pbOpSrc $!";
@contenu = <LSA>;
close LSA or die "Error pbShutSrc $!";

@nwcontenu = <LSB>;

foreach $ligne (@contenu) {
     next if length $ligne <= 6;
     $s1 = $ligne;
     $s1 =~ s/<TD\>//;
     $s2 = $s1;
     $s2 =~ s/()<.?TD\>//;
     # on aurez pu remplacer les 4ligne au dessus par: $ligne =~ s/<.?\w{2}\>//g;
 push @nwcontenu, $s2;
}

open(LSB, ">$listeb") or die "Error pbOpenCible $!";
print LSB @nwcontenu;
close LSB or die "Error pbShutCible $!";
END;

Voilà ceci est le même que plus haut mais avec une boucle foreach en moins. Comme quoi une fois que perl tiens une ligne,
on peut lui demander pas mal de chose....
Bon je vais me coucher, y à école demain.

retour