Introduction à Perl
(Pratical Extraction and Report language)
(pathologically Eclectic Rubbish Lister)
 

Historique

En 1987, Larry Wall créé un logiciel réutilisable pour débuguer des programmes.  Il met se logiciel à disposition pour les programmeurs  connecté à Usenet. Son logiciel fait un tabac. Vue l'engouement générale, il décide de l'enrichir. C'est de là que vient Perl. Le syntaxe de Perl est inspiré de Awk, sed, sh et C. Aujourd'hui, Perl en est à la version 5.

Les différents slogans de Perl résume bien ses capacités:

 Perl est un langage naturel Ceci signifie que la grammaire ou syntaxe de Perl est très riche et aussi très complexe. Mais si on connaît un peu la grammaire on peut arrivé à s'exprimer.
Avec Perl, il y a plus d’une façon de le faire (TIM-toady) Ceci veut dire qu'un programme peut être construit d'une infinité de manière différentes.
Perl rend le travail simple, facile et le travail difficile possible.
Perl est le couteau suisse des chaînes, ceci signifie que Perl à beaucoup de fonction facilitant le traitement des chaînes.

 

Caractéristiques

Points positifs:
Rapide/efficace pour programmer
Une fois qu'on maîtrise la programmation on peut faire des choses qu'on aurait fait en 50 ligne sous C en 10 lignes sous Perl.
Grand nombre de possibilités
Perl possède un très grand nombre de librairies qui lui donnes un nombre infini de possibilité.
Portable
Perl est supporté par quasiment toutes les plates formes.(Voir installation)
Points négatifs:
difficilement réutilisable
Un programme codé en Perl  par un expert est difficilement compréhensible. Il est souvent plus simple de recodé le programme.
s’écrit en un unique fichier
A part dans une approche objet, Perl s'écrit en un seul fichier.
Lent à l’exécution
Avant chaque exécution, Perl compile le programme et l'exécute. Ceci ralentis l'exécution.                                                                TOP
 
Installation
Linux par défaut sur:
Debian version 2.1 RedHat version 6.0
Slackware version 2.5 SuSE version 6.0
Unix
par défaut sur: Aix 4.3.3. Solaris 8  IRIX
pour HPUX  SCO :  source www.perl.com/CPAN-local/src/5.0/
Macintosh  www.macperl.com
Windows 9x/NT
Il faut téléchargé un exécutable sur activestate.

www.activestate.com/download/ActivePerl/Windows/5.6/

Début d ’un programme

Un programme Perl commence toujours par un ligne commençant par #! suivit de la position de l'exécutable Perl et des options de compilation:
Exemple sur Linux avec l'option warning (-W)
#!usr/bin/Perl - w
Exemple sur Windows avec l'option debug (-d)
#!c:/Perl/bin/Perl -d

 Les lignes suivantes sont les librairies utilisées, une librairie est appelé par le mot "use".

Exemples de librairies:

Use CGI;   : librairie pour accès web
Use SQL;   : librairie pour accéder à une base SQL
Use Socket;: librairie égal socket.h en C
                                                                                                       TOP

Variables

Les variables scalaires en Perl ne sont pas typées. elles sont "undifined" ou "defined" mais elles peuvent être successivement  des entiers, des nombres réel et  des chaînes de caractères. Toutes les variables scalaires commencent par le caractère $.
Exemple:
$variable=« Hello World »;
$variable=25;

Un tableau en perl commencent toujours par le caractère '@'. Comme les variables ne sont pas typé, un tableau peut posséder des variables des différents type.  la longueur du tableau est $#nomdutableau.

Exemple:
@Tab=("bonjour" ,"pierre",1,2);
le tableau Tab contient bonjour à la position 0. Pierre à la position 1, 1 à la position 2, 2 à la position3.
$#tab ==3;
la taille de Tab est 3.
$Tab[ 0] est la valeur de l'index 0 soit "Boujour".
 
Les tables de hashage en Perl commence par%.
exemple %tabhash:
%tabhash{$var}=@tab;

 

                                                                                                      TOP

Structures de contrôle

Conditions

La condition if en Perl est la même qu'en C.  If ( expression ){}else{}

La condition if inversé si ce n'est pas vrai .unless ( expression ){}

affectation de true val ou falseval à val suivant l'expression. $val=(expression  ?  truevalue  :  falsevalue);

boucles

La boucle do,  for et while  en Perl est la même qu'en C: do{}while/until (expression )

for{exp_initiale;test_exp;increm_exp }()

while(test_exp)()

La boucle foreach permet de faire une action sur chaque valeur d'un tableau:

foreach $i (@liste){}

Contrôles spéciaux

On peut faire des branchements en Perl:

last : branchement après la boucle

While(exp 1){ if( exp2 ){ last; }} #saut last ici

next : branchement en fin de boucle.

While(exp 1){ if( exp2 ){ next; } truc; #saut next ici}

redo: branchement en début de boucle

While(exp 1){#saut redo ici  truc;if( exp2 ){redo; }}

                                                                                                      TOP

Expressions Rationnelles

Les expressions rationnelles permettent de trouver des motifs dans une chaîne de caractère.

Motifs

 .   permet de reconnaître n ’importe quel lettre sauf \n

\s   Inversement \S permet de reconnaître les caractères qui ne sont pas des  espaces 

.

\d  : permet de reconnaître les chiffres [0-9] l' inverse est  \D

[ ...] :permet de reconnaître tout les caractères du crochet.

[^ ...] :permet de reconnaître tout les caractères qui ne sont pas dans le crochet .

Ancrage

  :  permet de reconnaître un motif en début de ligne.

Alternatif : "|" correspond à un ou.

Multiplicatif

, reconnaît 0 ou n fois  le motif précédent,

+ , reconnaît 1 ou n fois le motif précédent 

?, reconnaît  0 ou 1 fois le motif précédent 

/i   : ignorer la case .

Utilisations

/pattern/option

if ( $a =~ /^bon/ i) vrai si $a commence par bon ou Bon

s/pattern/replace/option

$wi= ~ s/y/x/g : remplace toute les y dans wi par x.

Split

@tab= split(/:/,$v) : coupe la chaîne $v suivant le délimiteur « : » et le stocke dans tab.

                                                                                                      TOP

Gestion Fichiers

Descripteurs
STDIN entrée standard STDOUT sortie standard
 
Fonction open
open(FILEH, « monfichier »); mon fichier est ouvert en lecture.
open(FILEW, « >monfichier »); mon fichier est ouvert en écriture.
open(FILEW, « >>monfichier »); mon fichier est ouvert en écriture et créé en mode append.
 
Fonction close
close (DES); ferme le descripteur de fichier
 
exemple: copie du fichier toto dans titi.
 
print "Voulez vous copier toto dans titi:";
if(<STDIN>=~ /(yes|oui)/i)
{
open(FILEW, ">>titi");
open(FILER, "toto");
while ($a=<FILER>)
{print FILEW "ligne de toto $a";}
close FILER;
close FILEW;
close FILEW;
}

Appel système

Exécution de programme
System(« programme »); C'est une fonction qui permet d'exécuter des commandes systèmes, seulement la sortie se fait sous  <STDIN>
`programme` ceci permet d'exécuter une fonction système  la sortie chaîne de caractère
open(DESCRI ,«|programme |»);  permet de rentrer des données en entrée du programme ou utiliser la sortie du pipe comme un descripteur de fichier,  La sortie ou l'entrée du programme est vu comme un fichier.
Gestion de processus
fork(); exec(); Les même fonctions qu'en C.

wait(); waitpid();

exemple: recopie de l'exécution de who vers lpr
#!/usr/bin/perl
open(LPR,« |lpr »);  
@mywho=`who`;
foreach $_ (@mywho){ print LPR $_; }
close LPR;
                                                                                                     TOP

Fonctions

Définition sous Fonctions

sub mafonction{

$_[0]; # premier argument @_; # tableau d ’argument

..

return $var;     return $var1,var2; }

Appel Sous Fonction

$var / @tab = mafonction($first, $second);

&myfunc (@list);

Toutes les variables sont globales.

Contournement my($variable_locale);

exemple:
#!c:/perl/bin/perl -w
a=1; $b=2;
$c=sum();
 
print  " valeur de sum : $c \n valeur de a: $a \n";
sub sum{
my($a)=10;
return $a+$b; }
Résultat:
valeur de sum : 12
nvaleur de a: 1

Orienté Objet

Le concept de classe sous Perl est appelé Package

Pour créer un objet on fait:

$obj=new Objet;

pour accéder à un attribut de l'objet

$obj -> référence; 

pour accéder à une fonction de l'objet

$obj -> fonction(param,param2); 

 
exemple
Dans le fichier "class" 
Package Personne;
my %champs=(nom=>undef,age=>undef,enfants=>undef);
 
Dans le programme utilisant la classe:
use Personne;
$lui=new Personne;
$lui->nom("Dupont");
$lui->age(30);
$lui->enfants(["lucie","pierre"];
                                                                                                     TOP

Le cgi

Header
nheader(); <HEAD>
nstart_html(); <HTML>
nh1('some','contents'); <H1>some contents</H1>
nh1({-align=>left},'contents');  <H1ALIGN="LEFT">contents</H1>
nListe
nradio_group(); <INPUT TYPE="radio">
npopup_menu(); <SELECT NAME="toto" >
ncheckbox(); <INPUT TYPE="checkbox">
ntextarea(); <INPUT TYPE="text" >
nscrolling_list( -name=> ’toto', -Values=>[England,France,] ,
-Labels=>{England=>"EN",France=>"FR",} , -size=>1,   -multiple=>0);
<SELECT NAME="toto" SIZE=1> <OPTION  VALUE="England">EN
<OPTION  VALUE="France">FR</SELECT>

 

Un exemple cgi

print  p,"What's your favorite color? ";
print popup_menu(-name=>'color',
    -values=>['red','green','blue','chartreuse']),p;
print $query->submit('Action','Send');
print $query->endform;
print    hr;
if (param()) {
    print "Your name is: ",em(param('name')),p,
"The keywords are: ",em(join(", ",param('words'))),p,
"Your favorite color is: ",em(param('color')),
hr;
}
print a({href=>'../cgi_docs.html'},'Go to the documentation');
print end_html;

                                                                                                      TOP

Un exemple de socket

Librairie Socket
nTcp Client
#!/usr/bin/perl -w
use Socket;
$remote='localhost';
$port=8011;
$iaddr=inet_aton($remote);
$paddr=sockaddr_in($port,$iaddr);
$proto=getprotobyname('tcp');
socket(SOCK,PF_INET,SOCK_STREAM,$proto);
connect(SOCK,$paddr);
while($ligne=<SOCK>) { print $ligne; }
close (SOCK);
exit;
TCP Serveur
#!/usr/bin/perl -w
use Socket;
$port=8011;
$proto=getprotobyname('tcp');
socket(Serveur,PF_INET,SOCK_STREAM,$proto);
setsockopt(Serveur,SOL_SOCKET,SO_REUSEADDR,pack("l",1));
bind(Serveur,sockaddr_in($port,INADDR_ANY));
listen(Serveur,SOMAXCONN);
for(;$paddr=accept(Client,Serveur);close Client)
{ ($portc,$iaddrcl)=sockaddr_in($paddr);
    $nom=gethostbyaddr($iaddrcl,AF_INET);
    print Client "Salut $nom coucou\n"; }
 
>>Salut localhost.localdomain coucou 

 

Conclusions

"Perl permet la paresse l’impatience et la démesure. "

Perl promotes laziness, impatience, and hubriss.

 

                                                                                                      TOP

Bibliographie

Introduction à Perl, RL.Schwartz & T.Christiansem, O ’reilly

 

Programming Perl,L.Walls & RL.Schwartz         O ’reilly

Sites

 Picking up Perl » www.ebb.org

www.perl.org

www.activestate.com

                                                                                                      TOP

Sommaire

Historique

Caractéristiques

Installation

Début d ’un programme

Variables

Structures de contrôle

Contrôles spéciaux

Expressions Rationnelles

Gestion Fichiers

Appel système

Fonctions

Orienté Objet

Le cgi

Un exemple cgi

Un exemple de socket

Conclusions

Bibliographie