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 : de root
