perl:fonctions
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
perl:fonctions [2009/03/15 00:42] – créée root | perl:fonctions [2013/03/12 23:40] (Version actuelle) – root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | == 1. Déclaration | + | ====== Fonctions ====== |
+ | |||
+ | ====== 1. Déclaration | ||
Il y a plusieurs façons de déclarer et implémenter une fonction en Perl, mais en pratique une seule (la plus simple) est utilisée : | Il y a plusieurs façons de déclarer et implémenter une fonction en Perl, mais en pratique une seule (la plus simple) est utilisée : | ||
- | sub produit { | + | <code perl> |
- | | + | sub produit { |
- | + | my ($a, $b) = @_; | |
- | | + | |
- | } | + | return $a * b; |
+ | } | ||
+ | </ | ||
- | === Nommage === | + | ===== Nommage |
Les conventions de nommage des fonctions est identique à celui des variables, sauf qu'il n'y pas besoin de symbole préfixe particulier. Comme les variables, la pratique standard consiste à utiliser des minuscules (y compris en orienté objet ou le CamelCase est rare comme nous le verrons). | Les conventions de nommage des fonctions est identique à celui des variables, sauf qu'il n'y pas besoin de symbole préfixe particulier. Comme les variables, la pratique standard consiste à utiliser des minuscules (y compris en orienté objet ou le CamelCase est rare comme nous le verrons). | ||
- | === Prototypage === | + | ===== Prototypage |
Il est possible de déclarer un simple prototype de fonction, comme en C, mais cela est en général inutile. En effet, le compilateur de Perl utilise "2 passes": | Il est possible de déclarer un simple prototype de fonction, comme en C, mais cela est en général inutile. En effet, le compilateur de Perl utilise "2 passes": | ||
- | | + | <code perl> |
- | + | | |
- | sub bonjour { | + | |
- | | + | sub bonjour { |
- | | + | my ($text) = @_; |
- | } | + | print "Hello $text !\n"; |
+ | } | ||
+ | </ | ||
- | === Appel === | + | ===== Appel ===== |
Quand il n'y a pas d' | Quand il n'y a pas d' | ||
- | my @cles = sort keys %hash; # Ou: sort(keys(%hash)); | + | <code perl> |
+ | my @cles = sort keys %hash; # Ou: sort(keys(%hash)); | ||
+ | </ | ||
La pratique consiste à utiliser les parenthèses à bon escient en favorisant la lisibilité : | La pratique consiste à utiliser les parenthèses à bon escient en favorisant la lisibilité : | ||
- | * Ne pas les utiliser quand on appel en cascade quelques fonctions simples, on obtient ainsi une forme quasiment "en anglais dans le texte" du programme (fonctions courantes: map, sort, grep, keys, ...) | + | |
- | * Les utiliser quand divers opérateurs (arithmétiques et/ou de comparaisons) sont impliqués et les associativités et précédences sont délicates à définir | + | * Les utiliser quand divers opérateurs (arithmétiques et/ou de comparaisons) sont impliqués et les associativités et précédences sont délicates à définir |
Il existe toutefois un piège: vous ne pouvez pas appeler une fonction sans utiliser les parenthèses si celle-ci est déclarée ***après*** l' | Il existe toutefois un piège: vous ne pouvez pas appeler une fonction sans utiliser les parenthèses si celle-ci est déclarée ***après*** l' | ||
- | == 2. Les paramètres == | + | ====== 2. Les paramètres |
On le voit dans la déclaration simplifiée de la fonction, les paramètres d'une fonction ne sont pas explicites: ils ne sont ni nommés ni typés. Cela peut permettre des fonctions très souples et capables de s' | On le voit dans la déclaration simplifiée de la fonction, les paramètres d'une fonction ne sont pas explicites: ils ne sont ni nommés ni typés. Cela peut permettre des fonctions très souples et capables de s' | ||
- | Les arguments passés à une fonction sont systématiquement convertis en une simple liste, appelée | + | Les arguments passés à une fonction sont systématiquement convertis en une simple liste, appelée |
- | * ''' | + | * **ma_fonction(55)**: un seul argument scalaire devient donc une liste à un élément (@_ = (55)) |
- | * ''' | + | * **ma_fonction(55, |
- | * ''' | + | * **ma_fonction(55, |
- | * ''' | + | * **ma_fonction(%hash)**: le tableau associatif est "mis à plat", c' |
- | ''' | + | **Note**: on peut éviter cette "mise à plat" des arguments d'une fonction en utilisant les références, |
Pour récupérer les paramètres en début de fonction, on utilise les fonctions de traitement de listes à notre disposition. Parmis les syntaxes les plus courantes, on trouve : | Pour récupérer les paramètres en début de fonction, on utilise les fonctions de traitement de listes à notre disposition. Parmis les syntaxes les plus courantes, on trouve : | ||
- | sub methode_a { | + | <code perl> |
- | | + | sub methode_a { |
- | | + | my ($nb, $temps, $item) = @_; |
- | } | + | ... |
- | + | } | |
- | sub methode_b { | + | |
- | | + | sub methode_b { |
- | | + | my $nb = shift; # Le paramètre par défaut de ' |
- | | + | my $temps = shift; |
- | | + | my $item = shift; |
- | } | + | ... |
+ | } | ||
+ | </ | ||
- | ''' | + | **Note**: si votre fonction accepte plusieurs scalaires et une unique liste en arguments, passez la liste en dernier argument - l' |
- | === Référence et copie === | + | ===== Référence et copie ===== |
- | Par défaut, les paramètres sont passés par référence. Cela signifie que les élements du tableau | + | Par défaut, les paramètres sont passés par référence. Cela signifie que les élements du tableau |
- | sub incremente { | + | <code perl> |
- | | + | |
- | } | + | $_[0]++; |
- | + | } | |
- | $a = 5; | + | |
- | | + | $a = 5; |
- | # $a vaut 6 | + | incremente($a); |
+ | # $a vaut 6 | ||
+ | </ | ||
Si on veut obtenir un passage par copie (cas le plus courant), il suffit d' | Si on veut obtenir un passage par copie (cas le plus courant), il suffit d' | ||
- | sub n_incremente_pas { | + | <code perl> |
- | | + | sub n_incremente_pas { |
- | | + | my $val = $_[0]; # Ou: my ($val) = @_; |
- | } | + | $val++; |
- | + | } | |
- | $a = 5; | + | |
- | | + | $a = 5; |
- | # $a vaut 5 | + | n_incremente_pas($a); |
+ | # $a vaut 5 | ||
+ | </ | ||
- | ''' | + | **Note**: si une constante est passée à une fonction et que cette dernière tente de la modifier, une erreur aura lieu lors de l' |
- | == 3. Valeur de retour == | + | ====== 3. Valeur de retour |
Le principe de la valeur de retour d'une fonction est identique à celui du passage des paramètres: | Le principe de la valeur de retour d'une fonction est identique à celui du passage des paramètres: | ||
- | * une liste vide: return () | + | |
- | * un scalaire (considéré comme une liste à 1 élément): return 42 | + | * un scalaire (considéré comme une liste à 1 élément): return 42 |
- | * une liste: return (5, 6, " | + | * une liste: return (5, 6, " |
Par défaut, une fonction Perl retourne la valeur de la dernière instruction évaluée, par exemple ici le résultat (booléen) du test : | Par défaut, une fonction Perl retourne la valeur de la dernière instruction évaluée, par exemple ici le résultat (booléen) du test : | ||
- | sub est_pair { | + | <code perl> |
- | | + | sub est_pair { |
- | } | + | $_[0] % 2 ====== 0; |
+ | } | ||
+ | </ | ||
Il est bien entendu possible de rendre ce fait explicite, et surtout de pouvoir retourner une valeur depuis n' | Il est bien entendu possible de rendre ce fait explicite, et surtout de pouvoir retourner une valeur depuis n' | ||
- | sub est_pair { | + | <code perl> |
- | | + | sub est_pair { |
- | } | + | return $_[0] % 2 ====== 0; |
+ | } | ||
+ | </ | ||
- | ''' | + | **Note**: pour les fonctions dont la valeur de retour n'a pas de signification particulière, |
- | sub une_fonction { | + | <code perl> |
- | | + | |
- | | + | ... |
- | } | + | 1; |
+ | } | ||
+ | </ | ||
Pour retourner une liste, il n'y a pas de surprise, et l' | Pour retourner une liste, il n'y a pas de surprise, et l' | ||
- | sub conjugue { | + | <code perl> |
- | | + | sub conjugue { |
- | | + | my ($re, $im) = @_; |
- | } | + | return ($re, -$im); |
- | + | } | |
- | | + | |
+ | my($cr, $ci) = conjugue($cr, | ||
+ | </ | ||
- | === Contextualisation === | + | ===== Contextualisation |
Afin de pouvoir programmer des fonctions qui profitent de la sensibilité au contexte, comme décrit dans le chapitre sur les variables, on a à disposition une simple fonction : | Afin de pouvoir programmer des fonctions qui profitent de la sensibilité au contexte, comme décrit dans le chapitre sur les variables, on a à disposition une simple fonction : | ||
- | sub meteo { | + | <code perl> |
- | | + | sub meteo { |
- | | + | ... |
- | } | + | return wantarray ? @temperatures_par_mois : $temperature_moyenne; |
- | + | } | |
- | my @mensuel = meteo; | + | |
- | my $moyenne = meteo; | + | my @mensuel = meteo; |
+ | my $moyenne = meteo; | ||
+ | </ | ||
Cette possibilité est très souvent utilisée par les fonctions qui renvoient des listes, pour également renvoyer une information " | Cette possibilité est très souvent utilisée par les fonctions qui renvoient des listes, pour également renvoyer une information " | ||
+ | <code perl> | ||
+ | ($sec, | ||
+ | $now = localtime(); | ||
+ | </ | ||
- | | + | **Note**: il existe aussi le contexte |
- | $now = localtime(); | + | |
- | + | ||
- | ''' | + |
perl/fonctions.1237077752.txt.gz · Dernière modification : 2009/03/15 00:42 de root