Cours Perl

Fonctions

Définir une fonction

Syntaxe

sub nomfonction{
    instructions ;
}
Appel : &nomfonction;
sub maprocedure{
    print "un essai de fonction\n";
}
&maprocedure;
Valeur retournée :
#!/usr/bin/perl

sub fonction1{
    $x = 3*5;
    $y = 2+1;
}

sub fonction2{
    return 3*7;
}

print &fonction1."\n";
print &fonction2."\n";
___
3
21
___

Arguments

La liste de variables suivant l'appel de la fonction représente les arguments de la fonction. C'est le tableau spécial @_ qui les stocke, on peut y accéder en écrivant : $_[n].
#!/usr/bin/perl
sub maxi{
    if($_[0] < $_[1]){
        return $_[1]
    }
    else{
        return $_[0]
    }
}
print "donnez un nombre : "; $x = <STDIN>;
print "donnez un nombre : "; $y = <STDIN>;
print "le maximum est ".&maxi($x, $y)."\n";
_______________________
donnez un nombre : 123
donnez un nombre : 345
le maximum est 345
______________________

Variables globales et locales

Dans une fonction les variables déclarées sont globales. Pour indiquer qu'elles sont locales il faut utiliser local avant perl version 5 et my en perl 5.
#!/usr/bin/perl

sub essai{
   my $x = 6;
   $y = 8;
}

$x = 5;
$y = 7;
&essai;
print "x = $x ; y = $y";
_____________
x = 5 ; y = 8
_____________

Fonctions prédéfinies

NB : les parenthèses ne sont pas obligatoires :
#!/usr/bin/perl

$x = sqrt 225;
$y = sqrt(144);

print "$x $y";
_____
15 12
_____

Mathématiques

nom description
abs(x) valeur absolue
cos(x) cosinus
exp(x) exponentielle
int(x) partie entière
log(x) logarithme
sin(x) sinus
sqrt(x) racine carrée de x
rand entier pseudo-aléatoire
srand nouvelle séquence de nombres pseudo-aléatoires
atan2(x, y) arc tangente de y/x

Chaînes de caractères

nom description
chop(chaine) suppression du dernier caractère
chomp(chaine) suppression du retour chariot
index(chaine, sschaine) indice de la première occurrence de chaine dans sschaine
length(chaine) taille de la chaine
lc(chaine) retourne la chaine en minuscules (perl 5)
lcfirst(chaine) retourne la chaine avec le premier caractère en minuscule
split(sep,chaine) sépare la chaine en éléments en fonction du séparateur
substr(chaine, début, longueur) extraction d'une sous-chaine
uc(chaine) retourne la chaine en majuscules (perl 5)
ucfirst(chaine) met le premier caractère de la chaine en majuscule
chr(code) retourne le caractère qui correspond au code ascii

Tableaux

grep(exp,tab) recherche l'expression dans un tableau, retourne liste correspondances
join(sep, tab) regroupe les éléments de tab dans une chaine en insérant le séparateur
pop(tab) retourne le dernier élément et le supprime
push(tab,elt) insère des éléments en fin de tableau
reverse(tab) inverse l'ordre des éléments
shift(tab) retourner et supprimer le premier élément
sort(tab) trie par ordre croissant les éléments.
splice(tab, deb, n) enlève n éléments de tab en commençant à deb, retourne les éléments supprimés
unshift(tab, elt) insère des éléments en début de tableau
@sport = ('ski', 'natation', 'randonnée'); print " @sport";
shift(@sport); print "\n @sport";
unshift(@sport, 'tennis'); print "\n @sport";
@sport = sort(@sport); print "\n @sport";
@sport = reverse(@sport); print "\n @sport";
pop(@sport); print "\n @sport";
push(@sport,'pelote-basque');
push(@sport,'ping-pong'); print "\n @sport";
@supprime = splice(@sport, 2, 2);
print "\n @sport";
print "\n @supprime \n"
_________________________________________
 ski natation randonnée
 natation randonnée
 tennis natation randonnée
 natation randonnée tennis
 tennis randonnée natation
 tennis randonnée
 tennis randonnée pelote-basque ping-pong
 tennis randonnée
 pelote-basque ping-pong 
__________________________________________

Tableaux indicés

keys(tab) liste des clés
values(tab) liste des valeurs
each(tab) parcourt la liste et donne clé-valeur
delete supprime une clé-valeur de la liste
exists pour savoir si un élément a été défini
#!/usr/bin/perl

%prix = ('poulets'=>34, 'moules'=>25, 'pizzas'=>20);

@listecle = keys %prix; 
print "\n@listecle";

@listevaleurs = values %prix; 
print "\n@listevaleurs";
______________________
pizzas poulets moules
20 34 25
______________________

Il est possible d'enchaîner les fonctions, chaque fonction prenant pour paramètre le résultat de la fonction précédemment exécutée (l'ordre d'exécution est de droite à gauche) :

#!/usr/bin/perl

%prix = ('poulets'=>34, 'moules'=>25, 'pizzas'=>20);
print  join ' ', reverse sort keys %prix;
______________________
poulets pizzas moules
______________________

Date et heure

timeretourne le nombre de secondes depuis le 1/01/1970
gmtimeretourne heure Greenwich
localtimeretourne heure locale
#!/usr/bin/perl

$dategm = gmtime; 
$datelocal = localtime;
print "GMT : $dategm\n";
print "Local : $datelocal\n";

($sec, $min, $h, $j, $m, $a, $sj, $aj, $isdst) = localtime time;

$mois = (qw(janvier février mars avril mail juin 
juillet aošt septembre octobre novembre décembre))[$m];

$jour = (qw(dimanche lundi mardi mercredi jeudi vendredi samedi))[$sj];

$annee = $a + 1900;

print "$jour $j $mois $annee\n";
print "$h h $min mn $sec s\n";
________________________________
GMT : Tue Jan 23 15:06:19 2001
Local : Tue Jan 23 10:06:19 2001
mardi 23 janvier 2001
10 h 6 mn 19 s
_________________________________

Fonctions système

nom description
die interruption du script et affichage d'un message
exec exécution d'un programme
exit interruption du script
getlogin donne le nom du login
sleep suspend l'exécution pendant une durée
system exécution d'un programme externe, le script est suspendu