#!/usr/bin/perl -w # Le modificateur -w facultatif permet de générer des diagnostics # script hello.pl, à lancer par # ./hello.pl # pour attribuer à tous le droit de l'exécuter : chmod +x hello.pl print "Bonjour tout le monde\n";
perl -e 'print "Bonjour tout le monde\n";'
#!/usr/bin/perl -w print "Quel est votre prénom ? "; # <STDIN> symbolise l'entrée standard $prenom = <STDIN>; print "Bonjour $prenom, donnez un nombre : "; # L'entrée standard peut être abrégée avec l'opérateur "diamant" <> $nb = <>; print " Vous avez choisi $nb \n";
type de variable | préfixe |
---|---|
scalaire | $ |
tableau (liste) | @ |
associative (hachage) | % |
fonction (routine)) | & |
fichier (handle) | sans |
$
.
$a = '24' ; # $a est une chaîne print $a + 1, "\n"; #affiche 25 ! attention pas de " "Il n'y a pas de variable de type booléen. Mais en revanche une valeur scalaire peut être interprétée comme la valeur booléenne vraie (TRUE) si ce n'est pas une chaîne vide ou le nombre 0 ou la chaîne "0".
$x= 0.75; $n= 123; $y= 1.6e-19; $octal= 015; #caractère retour-chariot $hexa = 0xff; # vaut 255 $a=200; $b=350 ; $s= $a + $b;
$monNom ="Jean"; $salut = "Bonjour $monNom" ; print $salut; affiche bien Bonjour Jean ! $s = 'Bonjour $monNom !' ; print $s; affiche par contre Bonjour $s $a=200; $b=350 ; # affiche $a + $b = 200 + 350 = 550 print '$a + $b', " = $a + $b = ", $a + $b , "\n";
ESSAI
) qui sert de délimitateur.
#!/usr/bin/perl $texte = <<"ESSAI"; Bonjour a tous ! ceci est un essai de texte multiligne ESSAI print $texte;Ceci est très utilisé pour générer du code HTML à renvoyer au client Web
print <<"marqueur"; <body> <h1>Voici un site WEB sur <a href="http://www.ac-creteil.fr/infolyc/linux/formation">linux</a> </h1> </body> marqueur
$_
$_
fait référence à la chaîne saisie.
$ligne=<STDIN>
stipule de lire une ligne sur l'entrée standard jusqu'au caractère de validation \n, et l'affecte à la variable $ligne, y compris \n
$ligne = <STDIN>; chop($ligne); print "La ligne saisie est : $ligne " ;
<STDIN>
en l'absence d'affectation explicite, c'est la variable $_ qui reçoit la ligne entrée.print "Pour sortir de la boucle Ctrl-C\n"; $i=0 ; # compteur de boucle while <STDIN> { chop($_); i++ ; print "La ligne $i est : $_ \n" ; }
$trouve=0 # trouve est fausse while (!$trouve) { # !$trouve = 1 if (....) { trouve = 1 ; # trouve devient vraie } }
@
, mais les éléments sont notés avec $, car ce sont des valeurs scalaires@chiffre = (0,1,2,3,4,5,6,7,8,9); @alphabet = (a..z, A..Z);
@alphanum = (a..z, A..Z , @chiffre); @alphanum = (@alphabet , @chiffre); @liste = (@liste , @chiffre);
@ARGV
: arguments de la ligne de commande, numérotées à partir de 0 ($ARGV[0])
est donc le 1er argument passé, et pas le nom du script qui est dans la variable $0
. (# shell !)
@INC
: chemins de recherche des fichiers requis par require
ou use
@_
: liste contenant les paramètres des routines
print "@liste";
$taille = @liste;
$i= $#liste ;
@liste=(2,3,5,7); print "le second élément est égal à ", $liste[1]; #la fonction qw() permet de simplifier la définition : @mots=("voici", "mon","prénom"," : ", "Jean"); @mots= qw(voici mon prénom : Jean); # ajout d'un 5ème élément au tableau @liste $liste[4] = 9; # affiche le dernier élément de la liste print $liste[$#liste]; # longueur de la liste @liste $lon = @liste; # ajout de l'élément suivant du tableau @liste $liste[@liste] = 11; # affectation d'un tableau par une liste de type intervalle @alphabet = ("a".."z"); @centaine =(0..99); @dix-a-vingt = @centaine[9..19]; # équivaut à @indice = ("i".."k"); @indice = @alphabet[8..10]; # affectation d'une liste de variables scalaires par une liste # on aura $var1="a"; $var2="b" ($var1, $var2) = @alphabet; # affichage global de la liste (les " " servent à séparer les éléments print "@liste"; parcours 1 de la liste avec foreach foreach $element (@liste) { print "$element "; } parcours 2 de la liste avec for # dans un contexte scalaire @liste est la longueur de la liste # comme dans $lon = @liste; for ($i =0 ; $i < @liste ; $i++ ) { print "élément numéro $i ---> $liste[$i]\n"; }
%
, les éléments étant des scalaires
%tab
et l'une de ses clés $cle
, alors sa valeur correspondante s'obtient par $tab{$cle}
(attention avec des accolades).%ENV
: liste des variables d'environnement
%SIG
: utilisé pour préciser les handlers
%INC
: liste des fichiers qui ont été appelés par require
keys(), values(), each()
while
.
@cles = keys(%tab); @valeurs = values(%tab); ($cle, $val)= each(%tab);
%tab = ("pi" , 3.14 , "e" , 2.72, "q", 1.6e-19); $expo= "e"; print "La constante $expo vaut : $tab{$expo}\n";
%tab = ("jean" , 500, "toto" , 501, "stage1", 502);
print "La liste des clés : keys(%tab)\n";
print "La liste des valeurs : values(%tab)\n";
# modèle de boucle pour parcourir le hachage
while (($cle, $val)= each
(%tab)) {
print "Le numéro de $cle est $val\n";
}
# même résultat, en plus compliqué ..
foreach $cle ( keys(%tab) ) {
print "Le numéro de $cle est $tab{$cle}\n"
}
print "salut"." jean"; # affiche "salut jean"
$x **=3; # $x=8
print "jean " x 10; #affiche "jean" 10 fois ...
$a = $b = $c = 5; $d = $a +($e = 10); # $e = 10 et $d = 15
$a = $b = 5; $c = ++$a; # $c = $a = 6 $d = $b++; # $d = 5 et $b = 6
chop()
et chmop()
chop
retire le dernier caractère de la chaine et retourne ce caractère
$b= "Bonjour à tous"; $a = chop($b); $b = "Bonjour à tou" et $a ="s"
chomp
ne retire qu'un caractère nouvelle ligne "\n"
, sinon rien.
defined
renvoie 1 (donc "vrai") si la variable qui suit est bien définieprint "Erreur, nom non défini !\n" if ! (defined $nom);
Comportement "pile" avec les fonctions push
(empiler) et pop
(dépiler)
@liste =(1..3); push (@liste, 4 , 5); # on peut empiler plusieurs valeurs, @liste=(1..5) $val = pop (@liste); # donne $val=5 et @liste=(1,2,3,4)Accès en début de liste avec les fonctions
shift
et unshift
@liste =(1..4); unshift (@liste, 7); # insére $val en élément 0, donne @liste=(7,1,2,3,4) $valeur = shift (@liste); # comme ($val, @liste)=@liste, donne $val=7 et @liste=(1..4)
""
ou bien "0"
, la condition est considérée comme false.
|
|
L'opérateur de comparaison cmp
pour les chaînes renvoie -1, 0 ou 1 selon que le premier argument est inférieur, égal ou supérieur au second.
print "Quel est votre âge : ?" $age = <STDIN>; # lecture clavier chomp($age); if ($age < 18 ) { # ou unless ($age >= 18 ) print("Vous êtes trop jeune pour voter!\n"); } else { print("Vous pouvez voter!\n"); $inscrits++ # compte les inscrits au vote }
if (test1) { instruction1 } elsif (test2) { instruction2 } elsif (test3) { instruction3 } else { # les 3 tests ont échoué instruction3 }
while (condition) { bloc } until (condition) { bloc }Ces 2 boucles "tournent" tant que la condition demeure vraie (pour while) ou fausse (until).
Exemples d'utilisation
# boucle d'attente while (<>) { last; } # lecture d'une ligne entrée au clavier, puis affichage while ($ligne=) { print $ligne; } @nombres=(0..10); print @liste,"\n"; print @lettres,"\n";print @nombres,"\n";$liste[5]=jean;print @liste,"\n";$i=0;
for
est identique à celle du C ou Java
@liste=(a..z); lon = @liste; for ($i=0 ; $i<lon ; i++) { print "Mot numéro $i ---> $liste[$i] \n"; } $i=0; foreach $mot (@liste) { print "Mot numéro $i ---> $mot \n"; $i++; }
print "La demande sera arrêtée par la saisie de la lettre \"z\" ou \"Z\" \n"; while () { chop($_); if (($_ eq "z") || ($_ eq "Z")) { last; } }
/ ... /
.$_
/html/
permet de repérer tout texte contenant
la séquence html
# pour déceler la chaine html dans la variable courante $_
if (/html/) {
print $_;
}
if (/htm/) { s/htm/html ; print $_; }Pour une étude complète, voir perl-expr-regulieres.html
<STDIN>
lit normalement la prochaine ligne jusqu'au caractère nouvelle ligne "\n" (qui fait partie de la chaine récupérée).
# pour placer la chaine lue dans la variable $ligne
$ligne = <STDIN>
while ($ligne=<STDIN>) { chomp($ligne) ; # pour enlever le caractère "fin de ligne" ..... # traitement sur $ligne print $ligne; } # pour sortir de la boucle : ctrl-C
# ouverture en lecture du fichier open(ENTREE, "<nomfichier"); # le caractère < est facultatif # lecture d'une ligne du fichier $ligne = (ENTREE, "<nomfichier"); le caractère < est facultatif # création et écriture dans un fichier open(SORTIE, ">nomfichier"); # ouverture en ajout dans un fichier existant open(SORTIE, ">>nomfichier"); # en ajout dans un fichier existant open(SORTIE, ">>nomfichier"); # fermeture close(SORTIE);
sub nom-fct { bloc instructions; }
&nom-fct [liste-paramètres] ;
return
, ou à défaut est la valeur renvoyée par la dernière instruction du corps de la fct.
my()
plus restrictive, la visibilité est limitée à la fonction courante, tandis que local() permet la visibilité dans les fonctions appelées par la fonction.
@_
$_[0], $_[1],
...
#!/usr/bin/perl print "Calcul de la distance entre \n"; print "x = "; $x= |
#!/usr/bin/perl # déclaration sub produit { local($p) = 1; foreach $_ (@_) { $p *= $_; } $p; # pour retourner le résultat } # Utilisation $p=3; # initialisation de la variable globale $p print &produit(1,2,3,4), "\n"; # cet appel affiche 24 |