perl:variables_et_structures_de_donnees
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
perl:variables_et_structures_de_donnees [2009/03/15 00:39] – créée root | perl:variables_et_structures_de_donnees [2013/03/12 23:40] (Version actuelle) – root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | == 1. Généralités | + | ====== Généralités |
- | === Nommage === | + | ====== 1. Les variables ====== |
+ | |||
+ | ===== Nommage | ||
Les noms de variables suivent les conventions du C : | Les noms de variables suivent les conventions du C : | ||
- | * elles doivent commencer par une lettre | + | |
- | * elles peuvent contenir des lettres, des chiffres et le caractère | + | * elles peuvent contenir des lettres, des chiffres et le caractère |
- | * la distinction majuscule/ | + | * la distinction majuscule/ |
- | Dans le style de programmation Perl traditionnel, | + | Dans le style de programmation Perl traditionnel, |
- | | + | <code perl> |
- | | + | |
- | | + | @liste = (" |
+ | %hash = (" | ||
+ | </ | ||
En Perl, on peut utiliser le même nom de variable pour des types de différents de manière indépendante. Par exemple, ces 3 variables co-existent et sont indépendantes : | En Perl, on peut utiliser le même nom de variable pour des types de différents de manière indépendante. Par exemple, ces 3 variables co-existent et sont indépendantes : | ||
- | $toto = " | + | <code perl> |
- | @toto = (" | + | $toto = " |
- | %toto = (" | + | @toto = (" |
+ | %toto = (" | ||
+ | </ | ||
- | ''' | + | **Note**: il existe quelques exceptions notables, dont le descripteur de fichier qui n'a pas de préfixe particulier et utilise traditionnellement des majuscules (ex: open(HANDLE, |
- | === Utilisation === | + | ===== Utilisation |
Les variables en Perl n'ont pas besoin d' | Les variables en Perl n'ont pas besoin d' | ||
- | for ($i = 0; $i < 5; $i++) { ... } | + | <code perl> |
+ | for ($i = 0; $i < 5; $i++) { ... } | ||
+ | </ | ||
Cependant, en pratique et notamment lorsqu' | Cependant, en pratique et notamment lorsqu' | ||
- | use strict; | + | <code perl> |
- | my $i; | + | use strict; |
- | for ($i = 0; $i < 5; $++) ... | + | my $i; |
+ | for ($i = 0; $i < 5; $++) ... | ||
+ | </ | ||
- | ''' | + | **Note**: la directive |
- | === Valeurs === | + | ===== Valeurs |
- | Une variable peut ne pas avoir de valeur, elle est alors ''' | + | Une variable peut ne pas avoir de valeur, elle est alors **indéfinie** (on pourrait dire non **initalisée** pour comparer au C). Cela veut dire que d'une part une " |
- | # | + | <code perl> |
- | + | | |
- | my $message; | + | |
- | print " | + | my $message; |
+ | print " | ||
+ | </ | ||
- | ... va générer le '' | + | ... va générer le //warning// suivant lors de l' |
+ | <code perl> | ||
+ | # $toto n' | ||
+ | my $toto; # $toto est déclarée et peut être utilisée, mais n'est pas définie | ||
+ | print " | ||
+ | $toto = 42; # $toto est définie | ||
+ | $toto = undef; # $toto n'est plus définie | ||
+ | </ | ||
- | # $toto n' | + | **Note**: on ne peut pas "dé-déclarer" |
- | my $toto; | + | |
- | | + | |
- | $toto = 42; # $toto est définie | + | |
- | $toto = undef; # $toto n'est plus définie | + | |
- | ''' | + | ====== 2. Les scalaires |
- | + | ||
- | == 2. Les scalaires == | + | |
Une valeur scalaire peut représenter les types de base suivants : | Une valeur scalaire peut représenter les types de base suivants : | ||
- | * un nombre entier | + | |
- | * un nombre à virgule flottante | + | * un nombre à virgule flottante |
- | * une chaîne de caractère | + | * une chaîne de caractère |
- | * une référence (que nous verrons plus tard) | + | * une référence (que nous verrons plus tard) |
- | my $int | + | <code perl> |
- | my $float | + | my $int = 42; |
- | my $string | + | my $float = 42.53; |
- | my $string2 = ' | + | my $string = " |
+ | my $string2 = ' | ||
+ | </ | ||
Perl permet de passer d'une représentation à une autre de manière transparente. Le point délicat consiste à comprendre quand le changement de représentation a lieu: on parle alors de contexte d'une opération. Voici par exemple deux façons de considérer la valeur " | Perl permet de passer d'une représentation à une autre de manière transparente. Le point délicat consiste à comprendre quand le changement de représentation a lieu: on parle alors de contexte d'une opération. Voici par exemple deux façons de considérer la valeur " | ||
- | my $val = 42; | + | <code perl> |
- | print "la valeur numérique n'est pas nulle" if $val != 0; | + | my $val = 42; |
- | print "la chaîne de caractère n'est pas vide" if $val ne '' | + | print "la valeur numérique n'est pas nulle" if $val != 0; |
- | + | print "la chaîne de caractère n'est pas vide" if $val ne //; | |
- | my $int = $val + 1; | + | |
- | my $string = $val . " le monde"; | + | my $int = $val + 1; # $int vaut 43 |
+ | my $string = $val . " le monde"; | ||
+ | </ | ||
- | S'il est toujours possible de transformer une valeur entière en une chaîne de caractère (en utilisant sa représentation décimale, éventuellement en " | + | S'il est toujours possible de transformer une valeur entière en une chaîne de caractère (en utilisant sa représentation décimale, éventuellement en " |
+ | <code perl> | ||
+ | print " | ||
+ | print "- 42" + 1; # Affiche 1 | ||
+ | </ | ||
- | | + | **Note**: certains opérateurs (comme la division) utilisent un contexte |
- | print "- 42" + 1; # Affiche 1 | + | |
- | ''' | + | <code perl> |
+ | my $age = 24; | ||
+ | my $majeur = ($age >= 18) ? true : false; | ||
+ | </ | ||
- | === Opérateurs arithmétiques === | + | $majeur prendra la valeur true car 24 supérieur à 18, dans le cas contraire la variable aurait pris la valeur false. |
+ | |||
+ | ===== Opérateurs arithmétiques | ||
Leur contexte est bien entendu entier, et tout scalaire impliqué dans une opération arithmétique est (éventuellement) converti en valeur numérique. On retrouve les opérateurs classiques : | Leur contexte est bien entendu entier, et tout scalaire impliqué dans une opération arithmétique est (éventuellement) converti en valeur numérique. On retrouve les opérateurs classiques : | ||
- | $n = ($x / 2 + 5) * 3 - $y; | + | <code perl> |
- | $n += 10; | + | $n = ($x / 2 + 5) * 3 - $y; |
- | $n++; | + | $n += 10; |
+ | $n++; | ||
+ | </ | ||
Pour comparer des valeurs arithmétiques, | Pour comparer des valeurs arithmétiques, | ||
+ | <code perl> | ||
my $a = 5; | my $a = 5; | ||
- | my $b = 9; | + | |
- | print " | + | print " |
- | print " | + | print " |
- | print " | + | print " |
+ | </ | ||
- | === Opérateurs de chaîne === | + | ===== Opérateurs de chaîne |
- | Leur conversion transforme automatiquement toute valeur numérique impliquée en sa représentation décimale. | + | Leur conversion transforme automatiquement toute valeur numérique impliquée en sa représentation décimale. |
- | $t = " | + | <code perl> |
- | $t = $t . " le monde"; | + | |
+ | $t = $t . " le monde"; | ||
+ | </ | ||
- | La plupart des manipulations intéressantes avec les chaînes se font via les expressions régulières. On trouve bien sûr les fonctions basiques comme '' | + | La plupart des manipulations intéressantes avec les chaînes se font via les expressions régulières. On trouve bien sûr les fonctions basiques comme //length//, //index// et //substr// par exemple. |
- | Pour comparer des chaînes, on utilise les opérateurs | + | Pour comparer des chaînes, on utilise les opérateurs |
- | my $u = " | + | <code perl> |
- | my $v = " | + | |
- | print " | + | my $v = " |
- | print " | + | print " |
+ | print " | ||
+ | </ | ||
- | == 3. Les listes == | + | ====== 3. Les listes |
Cette structure de donnée permet à la fois de gérer des tableaux et des listes de façon simple. Les éléments d'une liste en Perl sont des scalaires : | Cette structure de donnée permet à la fois de gérer des tableaux et des listes de façon simple. Les éléments d'une liste en Perl sont des scalaires : | ||
- | my @liste = (1, " | + | <code perl> |
+ | my @liste = (1, " | ||
+ | </ | ||
Pour accéder à un élément de la liste, il existe plusieurs moyens : | Pour accéder à un élément de la liste, il existe plusieurs moyens : | ||
- | my $a = shift(@liste); | + | <code perl> |
- | my $b = $liste[0]; | + | my $a = shift(@liste); |
- | my $c = $liste[-1]; | + | my $b = $liste[0]; # $b vaut " |
- | my (undef, $d) = @liste; | + | my $c = $liste[-1]; # $c vaut " |
+ | my (undef, $d) = @liste; # $d vaut " | ||
+ | </ | ||
Pour obtenir la taille d'une liste : | Pour obtenir la taille d'une liste : | ||
- | my $size = @liste; | + | <code perl> |
- | my $size = scalar(@liste); | + | my $size = @liste; |
- | my $size = $#liste + 1; | + | my $size = scalar(@liste); |
+ | my $size = $#liste + 1; | ||
+ | </ | ||
- | ''' | + | **Note**: nous reviendrons sur les conversions entre listes et scalaires plus tard. |
- | === Manipulations diverses === | + | ===== Manipulations diverses |
- | * Méthode alternative pour construire une liste : | + | |
- | | + | <code perl> |
- | | + | |
- | * Extraire une partie de la liste (voir '' | + | @liste = split(/ /, "Hello world !\n" |
- | | + | </ |
- | * Concaténer les éléments d'une liste (dans un scalaire): | + | |
- | | + | <code perl> |
- | * Ajouter un élément à une liste: | + | |
- | push @liste, ' | + | </ |
- | * Retirer le premier élément de la liste: | + | |
- | | + | <code perl> |
- | * Retirer un élément quelconque: | + | |
- | | + | </ |
- | * Trier une liste: | + | |
- | | + | <code perl> |
- | | + | |
- | * Filtrer une liste: | + | </ |
- | | + | |
- | * Transformer les éléments d'une liste un par un: | + | <code perl> |
- | | + | |
+ | </ | ||
+ | | ||
+ | <code perl> | ||
+ | | ||
+ | </ | ||
+ | | ||
+ | <code perl> | ||
+ | | ||
+ | @inverse = sort { ! $a <=> $b } @liste; | ||
+ | </ | ||
+ | | ||
+ | <code perl> | ||
+ | | ||
+ | </ | ||
+ | | ||
+ | <code perl> | ||
+ | | ||
+ | </ | ||
- | === Parcours === | + | ===== Parcours |
Une des opérations les plus courantes en Perl consiste à parcourir les éléments d'une liste un par un. Il existe de nombreuses façons de le faire, dont les plus courantes sont : | Une des opérations les plus courantes en Perl consiste à parcourir les éléments d'une liste un par un. Il existe de nombreuses façons de le faire, dont les plus courantes sont : | ||
- | | + | <code perl> |
- | | + | |
- | | + | foreach (@hello) { print $_; } |
- | print foreach @hello; | + | foreach (@hello) { print; } |
+ | print foreach @hello; | ||
+ | </ | ||
- | Il est possible dans une structure de contrôle d' | + | Il est possible dans une structure de contrôle d' |
- | A noter qu' | + | A noter qu' |
- | == 4. Les tableaux associatifs (hashes) == | + | ====== 4. Les tableaux associatifs (hashes) |
- | Cette structure de donnée est appelée | + | Cette structure de donnée est appelée |
Exemple de déclaration et d' | Exemple de déclaration et d' | ||
- | # Intialisation | + | <code perl> |
- | my %menu = ( | + | |
- | " | + | my %menu = ( |
- | " | + | " |
+ | " | ||
" | " | ||
- | " | + | " |
); | ); | ||
+ | | ||
+ | # Assignation | ||
+ | $menu{' | ||
+ | | ||
+ | # Lecture | ||
+ | print "Plat: " | ||
+ | </ | ||
- | # Assignation | + | **Note**: on peut trouver des intialisations où le symbole **=>** est simplement une virgule, Perl pouvant effectivement considérer un tableau associatif sous sa forme "à plat", c'est-à-dire sous forme de liste de paires (clé, valeur) successives. |
- | | + | |
- | # Lecture | + | ===== Manipulation diverses ===== |
- | print "Plat: " | + | |
+ | * Obtenir la liste des clés (indices) : | ||
+ | <code perl> | ||
+ | my @cle = keys %menu; | ||
+ | </ | ||
+ | * Vériier la présence d'une clé : | ||
+ | <code perl> | ||
+ | print "Le menu a un prix" if defined $menu{' | ||
+ | </ | ||
+ | * Ajouter un élément quelconque : | ||
+ | <code perl> | ||
+ | $menu($info) = " | ||
+ | </ | ||
+ | * Retirer un élément quelconque : | ||
+ | <code perl> | ||
+ | delete $menu{' | ||
+ | </ | ||
- | ''' | + | ===== Parcours ===== |
- | === Manipulation diverses === | + | Les hashes Perl ne sont pas " |
- | + | <code perl> | |
- | * Obtenir la liste des clés (indices) : | + | |
- | my @cle = keys %menu; | + | print "$cle: $val\n"; |
- | * Vériier la présence d'une clé : | + | } |
- | print "Le menu a un prix" if defined $menu{' | + | </ |
- | * Retirer un élément quelconque : | + | |
- | | + | |
- | + | ||
- | === Parcours === | + | |
- | + | ||
- | Les hashes Perl ne sont pas " | + | |
- | while (($cle, $val) = each %menu) { | + | |
- | | + | |
- | } | + | |
On peut également extraire d' | On peut également extraire d' | ||
- | print "$_: $menu{$_}\n" | + | <code perl> |
- | + | print "$_: $menu{$_}\n" | |
- | == 5. Contextes liste et scalaire == | + | </ |
+ | ====== 5. Contextes liste et scalaire | ||
De nombreuses fonctions et constructions en Perl peuvent accepter pour un même argument un scalaire ou une liste. Le point délicat vient du fait qu'en général, la même fonction ou construction se comporte différemment suivant qu' | De nombreuses fonctions et constructions en Perl peuvent accepter pour un même argument un scalaire ou une liste. Le point délicat vient du fait qu'en général, la même fonction ou construction se comporte différemment suivant qu' | ||
- | Par exemple, une liste évaluée dans un contexte scalaire renvoie le nombre de ses éléments. L' | + | Par exemple, une liste évaluée dans un contexte scalaire renvoie le nombre de ses éléments. L' |
- | if (@ARGV == 2) ... # Le nombre d' | + | <code perl> |
+ | | ||
+ | </ | ||
- | On peut changer le contexte simplement en comparant avec une liste, et cette-fois ce sont bien les éléments de '' | + | On peut changer le contexte simplement en comparant avec une liste, et cette-fois ce sont bien les éléments de //@ARGV// qui seront pris en comptes : |
- | if (@ARGV == (' | + | <code perl> |
+ | | ||
+ | </ | ||
- | ''' | + | **Note 1**: //print// sait automatiquement afficher une liste, mais il le fait en concaténant les éléments. On peut utiliser |
- | ''' | + | **Note 2**: //print// ne sait pas nativement afficher un hash, mais il y a plein de solutions simples comme //print "$k: $v\n" while ($k, $v) = each %asso//. |
Il existe d' | Il existe d' | ||
- |
perl/variables_et_structures_de_donnees.1237077570.txt.gz · Dernière modification : 2009/03/15 00:39 de root