perl:tests_if_until
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
perl:tests_if_until [2009/03/15 00:45] – créée root | perl:tests_if_until [2013/03/12 23:41] (Version actuelle) – root | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | == 1. If, else, elsif == | + | ====== Tests ====== |
+ | |||
+ | ====== 1. If, else, elsif ====== | ||
La structure des tests et des expressions booléennes en Perl est une fois de plus très similaire à ce que l'on trouve en C : | La structure des tests et des expressions booléennes en Perl est une fois de plus très similaire à ce que l'on trouve en C : | ||
- | if ($i > 0) { | + | <code perl> |
- | | + | if ($i > 0) { |
- | } | + | print "$i est strictement positif\n"; |
+ | } | ||
+ | </ | ||
Comme pour les boucles, on peut également profiter de l' | Comme pour les boucles, on peut également profiter de l' | ||
- | print "$i est un entier strictement positif\n" | + | <code perl> |
+ | print "$i est un entier strictement positif\n" | ||
+ | </ | ||
Pour proposer une branche alternative : | Pour proposer une branche alternative : | ||
- | if ($i >= 0) { | + | <code perl> |
- | | + | if ($i >= 0) { |
- | } else { | + | print "$i est positif"; |
- | | + | } else { |
- | } | + | print "$i est négatif"; |
+ | } | ||
+ | </ | ||
- | Par contre si l'on veut évaluer plusieurs branches (exclusives) en cascade, il y a le mot clé spécifique | + | Par contre si l'on veut évaluer plusieurs branches (exclusives) en cascade, il y a le mot clé spécifique |
- | | + | <code perl> |
- | elsif ($i == 0) { print "$i est nul"; } | + | |
- | | + | elsif ($i ====== 0) { print "$i est nul"; } |
+ | else { print "$i est négatif"; | ||
+ | </ | ||
- | C'est une erreur de syntaxe d' | + | C'est une erreur de syntaxe d' |
- | == 2. Opérateur ternaire == | + | ====== 2. Opérateur ternaire |
Encore un emprunt du C, il doit son nom à sa spécificité: | Encore un emprunt du C, il doit son nom à sa spécificité: | ||
- | my $signe = ($i >= 0) ? " | + | <code perl> |
+ | my $signe = ($i >= 0) ? " | ||
+ | </ | ||
... est équivalente à cette construction : | ... est équivalente à cette construction : | ||
+ | <code perl> | ||
+ | my $signe; | ||
+ | if ($i >= 0) { $signe = " | ||
+ | </ | ||
- | my $signe; | + | ====== 3. Expressions booléennes ====== |
- | if ($i >= 0) { $signe | + | |
+ | ===== Opérateurs de comparaison ===== | ||
- | == 3. Expressions booléennes == | + | ^ **Numérique** ^ **Chaîne** ^ **Description** ^ |
- | + | | < | lt | strictement inférieur| | |
- | === Opérateurs de comparaison === | + | | <= | le | inférieur ou égal| |
- | + | | > | gt | strictement supérieur| | |
- | {| bgcolor="# | + | | >= | ge | supérieur ou égal| |
- | |- bgcolor="# | + | | == | eq | identique| |
- | | ''' | + | | != | ne | différent| |
- | | ''' | + | | <=> | cmp | comparaison (pour le tri)| |
- | | ''' | + | |
- | |- | + | |
- | | < || lt || strictement inférieur | + | |
- | |- | + | |
- | | <= || le || inférieur ou égal | + | |
- | |- | + | |
- | | > || gt || strictement supérieur | + | |
- | |- | + | |
- | | >= || ge || supérieur ou égal | + | |
- | |- | + | |
- | | == || eq || identique | + | |
- | |- | + | |
- | | != || ne || différent | + | |
- | |- | + | |
- | | < | + | |
- | |} | + | |
Quelques exemples illustrant la différence entre les deux contextes : | Quelques exemples illustrant la différence entre les deux contextes : | ||
- | {| bgcolor="# | + | ^ **Numérique** ^ **Chaîne** ^ |
- | |- bgcolor="# | + | | " |
- | | ''' | + | | " |
- | | ''' | + | |
- | |- | + | |
- | | " | + | |
- | |- | + | |
- | | " | + | |
- | |} | + | |
- | Notes sur '' | + | Notes sur //cmp// et //<=>// : ces opérateurs sont utiles pour définir une relation d' |
- | {| bgcolor="# | + | ^ **Si...** ^ **Alors $a <=> $b vaut**^ |
- | |- bgcolor="# | + | | $a < $b | -1| |
- | | ''' | + | | $a ====== $b | 0| |
- | |- | + | | $a > $b | 1| |
- | | $a < $b || -1 | + | |
- | |- | + | |
- | | $a == $b || 0 | + | |
- | |- | + | |
- | | $a > $b || 1 | + | |
- | |} | + | |
- | === Valeurs booléennes des scalaires === | + | ===== Valeurs booléennes des scalaires |
Parfois on prend des raccourcis et on convertit un scalaire directement en valeur booléenne. Il existe donc une convention pour savoir si un scalaire est vrai ou faux : | Parfois on prend des raccourcis et on convertit un scalaire directement en valeur booléenne. Il existe donc une convention pour savoir si un scalaire est vrai ou faux : | ||
- | * si le scalaire n'est pas défini ou est une chaine vide, il est ''' | + | |
- | * si le scalaire est un entier nul, il est ''' | + | * si le scalaire est un entier nul, il est **faux** |
- | * dans tous les autres cas il est ''' | + | * dans tous les autres cas il est **vrai** |
Exemples : | Exemples : | ||
- | {| bgcolor="# | + | ^ **Valeur scalaire** ^ **Valeur |
- | |- bgcolor="# | + | | undef | faux| |
- | | ''' | + | | 0 | faux| |
- | |- | + | | " |
- | | undef || faux | + | | " |
- | |- | + | | " |
- | || 0 || faux | + | | -5 | vrai| |
- | |- | + | |
- | | " | + | |
- | |- | + | |
- | | " | + | |
- | |- | + | |
- | | " | + | |
- | |- | + | |
- | | -5 || vrai | + | |
- | |} | + | |
- | ''' | + | **Note**: le contexte d'une expression booléenne est toujours scalaire, donc une liste sera considérée comme son nombre d' |
- | === Opérateurs logiques === | + | ===== Opérateurs logiques |
On peut combiner le résultat des tests précédents, | On peut combiner le résultat des tests précédents, | ||
- | {| bgcolor="# | + | ^ **Opérateur** ^ **Description**^ |
- | |- bgcolor="# | + | | &&, and | ET logique| |
- | | ''' | + | | < |
- | |- | + | | xor | OU exclusif logique| |
- | | &&, and || ET logique | + | | !, not | négation logique (opérateur unaire)| |
- | |- | + | |
- | | < | + | |
- | |- | + | |
- | | xor || OU exclusif logique | + | |
- | |- | + | |
- | | !, not || négation logique (opérateur unaire) | + | |
- | |} | + | |
- | === Evaluation partielle === | + | ===== Evaluation partielle |
Cette technique est très populaire en Shell, et également parfois utilisée en programmation C. Elle repose sur le fait que les opérations logiques ET et OU peuvent avoir un résultat défini avec la valeur d'une seule opérande dans certains cas: | Cette technique est très populaire en Shell, et également parfois utilisée en programmation C. Elle repose sur le fait que les opérations logiques ET et OU peuvent avoir un résultat défini avec la valeur d'une seule opérande dans certains cas: | ||
- | * ''' | + | * **A and B**: si A est faux, alors le résultat est faux (B n'est pas évalué) |
- | * ''' | + | * **A or B**: si A est vrai, alors le résultat est vrai (B n'est pas évalué) |
On trouve ainsi très souvent ce genre de construction en Perl : | On trouve ainsi très souvent ce genre de construction en Perl : | ||
- | open(FILE, "< | + | |
- | Comme la plupart des fonctions Perl renvoient un état booléen dépendant de leur bonne exécution, la partie droite | + | Comme la plupart des fonctions Perl renvoient un état booléen dépendant de leur bonne exécution, la partie droite |
- | == 4. Tests sur les fichiers == | + | ====== 4. Tests sur les fichiers |
- | Perl a emprunté les facilités du Shell pour effectuer des tests directement sur des fichiers, ce qui est très pratique et évite d' | + | Perl a emprunté les facilités du Shell pour effectuer des tests directement sur des fichiers, ce qui est très pratique et évite d' |
- | my $file = " | + | <code perl> |
- | die " | + | |
+ | die " | ||
+ | </ | ||
Pour référence, | Pour référence, | ||
- | {| bgcolor="# | + | ^ -r ^ File is readable by effective uid/gid.^ |
- | | -r | + | | -w | File is writable by effective uid/gid.| |
- | |- | + | | -x | File is executable by effective uid/gid.| |
- | | -w || File is writable by effective uid/gid. | + | | -o | File is owned by effective uid.| |
- | |- | + | | | |
- | | -x || File is executable by effective uid/gid. | + | | -R | File is readable by real uid/gid.| |
- | |- | + | | -W | File is writable by real uid/gid.| |
- | | -o || File is owned by effective uid. | + | | -X | File is executable by real uid/gid.| |
- | |- | + | | -O | File is owned by real uid.| |
- | | || | + | | | |
- | |- | + | | -e | File exists.| |
- | | -R || File is readable by real uid/gid. | + | | -z | File has zero size (is empty).| |
- | |- | + | | -s | File has nonzero size (returns size in bytes).| |
- | | -W || File is writable by real uid/gid. | + | | | | |
- | |- | + | | -f | File is a plain file.| |
- | | -X || File is executable by real uid/gid. | + | | -d | File is a directory.| |
- | |- | + | | -l | File is a symbolic link.| |
- | | -O || File is owned by real uid. | + | | -p | File is a named pipe (FIFO), or Filehandle is a pipe.| |
- | |- | + | | -S | File is a socket.| |
- | | || | + | | -b | File is a block special file.| |
- | |- | + | | -c | File is a character special file.| |
- | | -e || File exists. | + | | -t | Filehandle is opened to a tty.| |
- | |- | + | | | | |
- | | -z || File has zero size (is empty). | + | | -u | File has setuid bit set.| |
- | |- | + | | -g | File has setgid bit set.| |
- | | -s || File has nonzero size (returns size in bytes). | + | | -k | File has sticky bit set.| |
- | |- | + | | | | |
- | | || | + | | -T | File is an ASCII text file (heuristic guess).| |
- | |- | + | | -B | File is a " |
- | | -f || File is a plain file. | + | | | | |
- | |- | + | | -M | Script start time minus file modification time, in days.| |
- | | -d || File is a directory. | + | | -A | Same for access time.| |
- | |- | + | | -C | Same for inode change time (Unix, may differ for other platforms)| |
- | | -l || File is a symbolic link. | + | |
- | |- | + | |
- | | -p || File is a named pipe (FIFO), or Filehandle is a pipe. | + | |
- | |- | + | |
- | | -S || File is a socket. | + | |
- | |- | + | |
- | | -b || File is a block special file. | + | |
- | |- | + | |
- | | -c || File is a character special file. | + | |
- | |- | + | |
- | | -t || Filehandle is opened to a tty. | + | |
- | |- | + | |
- | | || | + | |
- | |- | + | |
- | | -u || File has setuid bit set. | + | |
- | |- | + | |
- | | -g || File has setgid bit set. | + | |
- | |- | + | |
- | | -k || File has sticky bit set. | + | |
- | |- | + | |
- | | || | + | |
- | |- | + | |
- | | -T || File is an ASCII text file (heuristic guess). | + | |
- | |- | + | |
- | | -B || File is a " | + | |
- | |- | + | |
- | | || | + | |
- | |- | + | |
- | | -M || Script start time minus file modification time, in days. | + | |
- | |- | + | |
- | | -A || Same for access time. | + | |
- | |- | + | |
- | | -C || Same for inode change time (Unix, may differ for other platforms) | + | |
- | |} | + |
perl/tests_if_until.1237077908.txt.gz · Dernière modification : 2009/03/15 00:45 de root