<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rv</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rv"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Rv"/>
	<updated>2026-04-19T12:10:43Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Perl&amp;diff=9652</id>
		<title>Perl</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Perl&amp;diff=9652"/>
		<updated>2005-10-24T10:44:20Z</updated>

		<summary type="html">&lt;p&gt;Rv : /* Sur Internet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Développer sous Linux]]&lt;br /&gt;
= Perl =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;leatitre&amp;quot;&amp;gt;Perl&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leapar&amp;quot;&amp;gt;par Jice et [mailto:jonesy_at_wanadoo_point_fr Jonesy]&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;leadesc&amp;quot;&amp;gt;Installation et introduction à Perl.&amp;lt;/div&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Avant propos ==&lt;br /&gt;
&lt;br /&gt;
Ceci n&#039;est qu&#039;une introduction au Perl, car nous pourrions écrire 4 ou 5 livres, voir plus, sur ce sujet ! ;-) Donc ne vous attendez pas à faire le tour de la question... &amp;lt;br /&amp;gt;Et je précise aussi, que ce n&#039;est pas non plus un cours de programmation : cet article s&#039;adresse à des personnes possédant des bases de programmation et voulant se mettre à Perl.&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
&lt;br /&gt;
Perl est un langage de programmation extrêmement efficace pour traiter les fichiers et les chaînes de caractères. Venant du monde Unix, il intègre toutes les fonctions que l&#039;on peut retrouver en shell avec des commandes comme grep, sed, awk, ... Sa syntaxe générale ressemble beaucoup à celle du C et du shell. De plus, il est très apprécié des administrateurs système afin de gérer les fichiers de log.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Note de Jice&amp;lt;/u&amp;gt; : Perl est un langage très polyvalent. LE jeu, j&#039;ai nommé [http://www.frozen-bubble.org Frozen Bubble], est même programmé en Perl !&lt;br /&gt;
&lt;br /&gt;
=== Les particularités de Perl ===&lt;br /&gt;
&lt;br /&gt;
* C&#039;est un langage compilé et interprété. C&#039;est à dire que l&#039;on écrit le script, un simple fichier texte, puis à chaque fois que nous exécutons le script, l&#039;interpréteur compile le code à la volée sous une forme intermédiaire et exécute les commandes. &amp;lt;br /&amp;gt;On pourrait ainsi croire qu&#039;un script Perl est moins performant qu&#039;un programme C compilé, mais il s&#039;avère souvent plus performant et plus facile de faire un programme en Perl qu&#039;en C.&lt;br /&gt;
* Ce langage est disponible sur quasiment toutes les plates-formes et tous les systèmes possibles, Linux, Unices, Mac OS... Donc nos scripts Perl fonctionneront sur toutes ces machines sans aucune adaptation (à moins d&#039;utilisation de spécificités d&#039;un système d&#039;exploitation). Ce qui rend Perl disponible sur autant de systèmes, c&#039;est ses licences. Perl est Libre et est sous la licence GPL ou Artistic au choix.&lt;br /&gt;
* Perl est un langage qui permet la programmation &#039;&#039;orientée objet&#039;&#039;. Cet aspect du langage dépasse largement le cadre de cet article.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== L&#039;installation ==&lt;br /&gt;
&lt;br /&gt;
Dans cette partie, je n&#039;aborde que l&#039;installation de Perl sur un système Linux, et ce quelque soit la distribution. Enfin, j&#039;espère... ;-) &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Vérifions si Perl est présent ===&lt;br /&gt;
&lt;br /&gt;
Il y a des chances pour que Perl soit déjà installé avec notre distribution ou que celle-ci fournisse un package Perl. Pour vérifier si Perl est déjà sur notre système faisons, en console : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;perl -v&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Ceci doit nous retourner un message du genre: &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;This is perl, v5.6.1 built for i386-linux&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Copyright 1987-2001, Larry Wall&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Perl may be copied only under the terms of either the Artistic licence or the GNU General Public licence, which may be found in the Perl 5 source kit.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Complete documentation for Perl, including FAQ lists, should be found on this system using `man perl&#039; or `perldoc perl&#039;. If you have access to the Internet, point your browser at http://www.perl.com/, the Perl Home Page.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si c&#039;est le cas, nous pouvons sauter le paragraphe suivant.&lt;br /&gt;
&lt;br /&gt;
=== Installation de Perl ===&lt;br /&gt;
&lt;br /&gt;
Pas de chance... Donc allons voir si notre distribution fournit un package et si oui, installons-le. Sinon... &amp;lt;br /&amp;gt;Les binaires sont accessibles ici : &amp;lt;tt&amp;gt;[http://www.activestate.com/Products/Download/Get.plex?id=ActivePerl&amp;amp;_x=1 http://www.activestate.com/Products/Download/Get.plex?id=ActivePerl&amp;amp;_x=1]&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Note : je viens de remarquer que maintenant il demande e-mail, prénom et nom pour télécharger Perl. &amp;lt;br /&amp;gt;Les sources sont accessibles ici : &amp;lt;tt&amp;gt;http://www.perl.com/pub/a/langage/info/software.html#sourcecode&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maintenant détarons le package &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;tar -xvzf &amp;lt;votre package&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Allons sous le répertoire créé.&lt;br /&gt;
&lt;br /&gt;
Si nous souhaitons choisir nos paramètres en répondant à des questions : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;./Configure -Dprefix=/usr&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;En root (&amp;lt;tt&amp;gt;su&amp;lt;/tt&amp;gt;) &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;make install&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sinon, pour une installation par défaut : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;./Configure -Dprefix=/usr -d -e&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;En root (&amp;lt;tt&amp;gt;su&amp;lt;/tt&amp;gt;) &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;make install&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vérifions que Perl est bien installé &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;perl -v&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Introduction au langage Perl ==&lt;br /&gt;
&lt;br /&gt;
=== Les principales règles du Perl ===&lt;br /&gt;
&lt;br /&gt;
* Les lignes de code se terminent par un point virgule.&lt;br /&gt;
* Les noms de variables doivent être précédés par un caractère pour les identifier : &lt;br /&gt;
** une variable scalaire (nombre, chaîne de caractères...) est identifié par le symbole &#039;&amp;lt;tt&amp;gt;$&amp;lt;/tt&amp;gt;&#039;, par exemple &amp;lt;tt&amp;gt;$chaine&amp;lt;/tt&amp;gt;,&lt;br /&gt;
** un tableau par le symbole &#039;&amp;lt;tt&amp;gt;@&amp;lt;/tt&amp;gt;&#039;, par exemple &amp;lt;tt&amp;gt;@tableau&amp;lt;/tt&amp;gt;, et &amp;lt;tt&amp;gt;$tableau[12]&amp;lt;/tt&amp;gt; représente l&#039;élément n° 12. Un tableau est toujours unidimensionnel, c&#039;est pourquoi on parle aussi de liste (voir plus bas pour les&amp;lt;font color=&amp;quot;#000000&amp;quot;&amp;gt; [#structurescomplexes tableaux multidimensionnels])&amp;lt;/font&amp;gt;. Afin de définir un tableau, on écrit : &amp;lt;tt&amp;gt;@tableau = (val1, val2, ... , valn);&amp;lt;/tt&amp;gt;&lt;br /&gt;
** un &#039;&#039;hachage&#039;&#039; (&#039;&#039;hash&#039;&#039; en anglais) est identifié par le symbole &#039;&amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;&#039;, par exemple &amp;lt;tt&amp;gt;%hash&amp;lt;/tt&amp;gt;. Un hachage une structure indexée par des chaînes de caractères. &amp;lt;tt&amp;gt;$hash{&#039;prenom&#039;}&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;$hash{&#039;nom&#039;}&amp;lt;/tt&amp;gt; serviront à enregistrer le prénom et le nom de quelqu&#039;un de façon explicite. Un hachage est défini de la manière suivante : &amp;lt;tt&amp;gt;%hash = ( prenom =&amp;gt; &#039;jice&#039;, nom =&amp;gt; &#039;cardot&#039; );&amp;lt;/tt&amp;gt;&lt;br /&gt;
* La déclaration des variables est non typée. C&#039;est à dire que nous n&#039;avons pas besoin de dire si cette variable va contenir une chaîne de caractère ou un entier. D&#039;ailleurs, une même variable pourrait contenir à un moment un entier et à un autre une chaîne, mais ce n&#039;est pas conseillé pour la relecture du code.&lt;br /&gt;
* Il y a deux sortes de chaînes de caractères. La chaîne de caractère définie entre simples cotes (&#039;) n&#039;est pas interpolée. La chaîne de caractères définie entre guillemets (&amp;quot;) est interpolée. Lorsque le Perl interprète une chaîne, il va regardé le contenu de celle-ci pour remplacer les variables qu&#039;il trouvera par leurs valeurs. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;Notation&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;q(chaîne)&amp;lt;/tt&amp;gt; est synonyme de &amp;lt;tt&amp;gt;&#039;chaîne&#039;&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;qq(chaîne)&amp;lt;/tt&amp;gt; de &amp;lt;tt&amp;gt;&amp;quot;chaîne&amp;quot;&amp;lt;/tt&amp;gt;. Remarquons que les parenthèses dans cette notation peuvent être remplacées par tout autre caractère, comme par exemple &amp;lt;tt&amp;gt;qq|chaîne|&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;qq!chaîne!&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* La déclaration des variables n&#039;est pas obligatoire. Il y a une commande pour nous obliger à déclarer les variables et d&#039;autres choses. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;use&#039;&#039;&#039; strict;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Je conseille très fortement d&#039;utiliser ceci, afin d&#039;écrire un code source plus propre et lisible. En effet, cette directive impose de déclarer les variables, et interdit certaines constructions dangereuses... Ceci facilite la recherche d&#039;erreurs, et le débutant prend ainsi dès le début de bonnes habitudes de programmation.&lt;br /&gt;
* Un &#039;&#039;&#039;bloc&#039;&#039;&#039; est une suite d&#039;instructions, séparées par des points virgules, et entourée d&#039;accolades. Par exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    $toto = 12;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    print $toto;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;est un bloc.&lt;br /&gt;
&lt;br /&gt;
=== Définir l&#039;interpréteur ===&lt;br /&gt;
&lt;br /&gt;
Le fait de définir l&#039;interpréteur dans le script permet de l&#039;exécuter directement. Pour ce faire il faut placer la ligne suivante au tout début du script : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/usr/bin/perl&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Ce qui permettra d&#039;exécuter le script directement par : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;./script.pl&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Sans cette ligne il faudrait exécuter le script comme ceci : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;perl&#039;&#039;&#039; script.pl&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;En ajoutant l&#039;option &amp;lt;tt&amp;gt;-W&amp;lt;/tt&amp;gt;, nous obtenons la liste des toutes les erreurs et de tous les avertissements lors de l&#039;interprétation du script. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Les commentaires ===&lt;br /&gt;
&lt;br /&gt;
Un commentaire débute par un caractère dièse (#). Tout ce qui suit ce caractère jusqu&#039;à la fin de la ligne sera considéré comme du commentaire. &amp;lt;br /&amp;gt;Par exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Ceci est un exemple de commentaire&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;print &amp;quot;test&amp;quot;; # un 2ème commentaire&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Utiliser une libraire particulière ===&lt;br /&gt;
&lt;br /&gt;
L&#039;extension des fichiers librairies (ou module) est &amp;lt;tt&amp;gt;pm&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;pm&amp;lt;/tt&amp;gt; signifie Perl Module. &amp;lt;br /&amp;gt;Pour appeler une librairie, on ajoute la directive : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;use&#039;&#039;&#039; la_librairie;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Pour indiquer à perl où chercher nos librairies personnelles, on utilise la directive : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;use&#039;&#039;&#039; &#039;&#039;&#039;lib&#039;&#039;&#039; &amp;quot;le chemin d&#039;accès&amp;quot;;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : les chemins de recherche des librairies sont définit dans le tableau &amp;lt;tt&amp;gt;@INC&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Déclarer une variable ===&lt;br /&gt;
&lt;br /&gt;
==== Variable globale : ====&lt;br /&gt;
&lt;br /&gt;
Cela se fait automatiquement lors de la première utilisation de la variable. Cependant, lorsqu&#039;on utilise &amp;lt;tt&amp;gt;use strict&amp;lt;/tt&amp;gt;, il faut déclarer les variables globales par la directive suivante : &amp;lt;tt&amp;gt;&#039;&#039;&#039;use vars qw(&#039;&#039;&#039;$var1 $var2 @tab1 %hash1&#039;&#039;&#039;);&#039;&#039;&#039;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : le mot clef &amp;lt;tt&amp;gt;local&amp;lt;/tt&amp;gt; s&#039;applique à une variable globale (&amp;lt;tt&amp;gt;&#039;&#039;&#039;local &#039;&#039;&#039;$variable;&amp;lt;/tt&amp;gt;). Il permet à l&#039;intérieur d&#039;un bloc de cacher une variable globale par une autre valeur. La variable reste globale, c&#039;est à dire que dans les procédures appelées dans le bloc, la nouvelle valeur est utilisée ; à la fin du bloc, l&#039;ancienne valeur est restaurée.&lt;br /&gt;
&lt;br /&gt;
==== Variable lexicale : ====&lt;br /&gt;
&lt;br /&gt;
Une variable lexicale n&#039;existe qu&#039;à l&#039;intérieur d&#039;un bloc. On parle aussi de variable locale. &amp;lt;br /&amp;gt;On la déclare par &amp;lt;tt&amp;gt;&#039;&#039;&#039;my&#039;&#039;&#039; $variable&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;&#039;&#039;&#039;my&#039;&#039;&#039; @tableau&amp;lt;/tt&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
Pour déclarer plusieurs variables et un tableau en une seule commande, faire : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;my &#039;&#039;&#039;($var1, $var2, @tab);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Les opérateurs ===&lt;br /&gt;
&lt;br /&gt;
Voici les opérateurs les plus couramment utilisés. Pour plus d&#039;info sur les opérateurs : &amp;lt;tt&amp;gt;man perlop&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Opérateurs unaires ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;!&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: négation logique. Si &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;$a&amp;lt;/tt&amp;gt; vaut vrai, &amp;lt;tt&amp;gt;!$a&amp;lt;/tt&amp;gt; vaudra faux.&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: négation arithmétique. Si &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;$a&amp;lt;/tt&amp;gt; vaut 2, &amp;lt;tt&amp;gt;-$a&amp;lt;/tt&amp;gt; vaudra -2.&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;~&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: négation binaire ou complément à 1.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;++&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: incrémentation ; si ++ est placé avant la variable, il la décrémente avant de retourner la valeur, s&#039;il est placé après, il retourne la valeur puis l&#039;incrémente. Exemple : &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;[http://paris.mongueurs.net/aplusplus.html $A++]&amp;lt;/tt&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;--&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: décrémentation ; idem.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Opérateurs binaires ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;+ - * / % **&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: opérations arithmétiques (% est le modulo, ** est l&#039;exponentiation).&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: concatène deux chaînes : &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;&amp;quot;aze&amp;quot;.&amp;quot;rty&amp;quot;&amp;lt;/tt&amp;gt; vaut &amp;lt;tt&amp;gt;&amp;quot;azerty&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: &amp;quot;multiplie&amp;quot; une chaîne : &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;&amp;quot;to&amp;quot; x 2&amp;lt;/tt&amp;gt; vaut &amp;lt;tt&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp; | ^ &amp;lt;&amp;lt; &amp;gt;&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: opérations sur les bits : et, ou, ou exclusif (&amp;lt;/nowiki&amp;gt;&#039;&#039;xor&#039;&#039;), décalage à gauche, à droite.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;amp;&amp;amp; &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: et logique, ou logique.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Opérateur ternaire ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;?: &amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: cet opérateur particulier est nommé &amp;quot;opérateur conditionnel&amp;quot;. Il fonctionne à la manière d&#039;un &amp;lt;/nowiki&amp;gt;&#039;&#039;si alors sinon&#039;&#039;. Si l&#039;expression à gauche du ? est vraie, l&#039;argument avant le : est retourné, sinon l&#039;argument après le : est retourné. Mieux vaut un exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;print ($n&amp;gt;1)?&#039;s&#039;:&#039;&#039;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;affichera &amp;lt;tt&amp;gt;&#039;s&#039;&amp;lt;/tt&amp;gt; si &amp;lt;tt&amp;gt;$n&amp;lt;/tt&amp;gt; est plus grand que 1, et n&#039;affichera rien (&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;) sinon.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Opérateurs de comparaison numériques ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt; &amp;lt;= &amp;gt; &amp;gt;=&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: plus petit, plus petit ou égal, plus grand, plus grand ou égal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;== !=&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: égal, différent&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Opérateurs de comparaison pour les chaînes de caractères ====&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;lt gt le ge&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: plus petit, plus petit ou égal, plus grand, plus grand ou égal&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;eq ne&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: égal, différent&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;=~ !~&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;: teste si une chaîne de caractères correspond à une expression régulière. Voir le paragraphe &amp;lt;/nowiki&amp;gt;[#expressions_regulieres expressions régulières].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== L&#039;affectation d&#039;une variable ===&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur d&#039;affectation &amp;quot;normal&amp;quot; est &#039;&amp;lt;tt&amp;gt;=&amp;lt;/tt&amp;gt;&#039;. Par exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable &#039;&#039;&#039;=&#039;&#039;&#039; mavaleur;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;affecte la valeur &amp;lt;tt&amp;gt;mavaleur&amp;lt;/tt&amp;gt; à la variable &amp;lt;tt&amp;gt;$variable&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
D&#039;autres opérateurs d&#039;affectation sont un raccourci pour les opérations binaires. &amp;lt;br /&amp;gt;Par exemple &amp;lt;tt&amp;gt;$a &#039;&#039;&#039;+=&#039;&#039;&#039; 2&amp;lt;/tt&amp;gt; est un raccourci pour &amp;lt;tt&amp;gt;$a = $a &#039;&#039;&#039;+&#039;&#039;&#039; 2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Les opérateurs d&#039;affectation les plus couramment utilisés sont :&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;  =&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: affectation &amp;quot;standard&amp;quot;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt; +=  -=  *=  /=   %=&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: pour les opérations arithmétiques (+, -, *, / et modulo)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;amp;&amp;amp;= ||=  !=&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: pour les opérations logiques (et logique, ou logique, non logique)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt; &amp;amp;=  |=  ^=  ~=  &amp;lt;&amp;lt;=  &amp;gt;&amp;gt;=&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: pour les opérations logiques sur les bits (et, ou, ou exclusif, complément à 1, décalages gauche et droite)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt; .=&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;: pour les opérations sur les chaînes de caractères (concaténation)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt; =~  !~&amp;lt;/tt&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;nowiki&amp;gt;: pour les expressions régulières (voir &amp;lt;/nowiki&amp;gt;[[#Les expressions régulières, ou regex|plus bas]]).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Quelques variables particulières prédéfinies ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;use English;&amp;lt;/tt&amp;gt; permet d&#039;utiliser les noms des variables au lieu des noms standards des variables spéciales (ex : &amp;lt;tt&amp;gt;$ARG&amp;lt;/tt&amp;gt; au lieu de &amp;lt;tt&amp;gt;$_&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;@_&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;@ARG&amp;lt;/tt&amp;gt; : Tableau d&#039;arguments. Sert pour le passage de paramètres. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$_&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$ARG&amp;lt;/tt&amp;gt; : Variable par défaut des fonctions unaires entrées/sorties, recherche... &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$/&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$RS&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$INPUT_RECORD_SEPARATOR&amp;lt;/tt&amp;gt; : fin de ligne lorsqu&#039;on lit un fichier, &amp;lt;tt&amp;gt;\n&amp;lt;/tt&amp;gt; par défaut sous unix et &amp;lt;tt&amp;gt;\r\n&amp;lt;/tt&amp;gt; sous windows. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$!&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$ERRNO&amp;lt;/tt&amp;gt; : suivant le contexte d&#039;utilisation, retourne le numéro de la dernière erreur système, ou le message d&#039;erreur système. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$0&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$PROGRAM_NAME&amp;lt;/tt&amp;gt; : Nom du fichier qui contient le script Perl. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$^0&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;$OSNAME&amp;lt;/tt&amp;gt; : Nom du système d&#039;exploitation. &amp;lt;br /&amp;gt;Utiliser une variable d&#039;environnement &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable = $ENV{&amp;quot;nom de la variable d&#039;environnement&amp;quot;};&amp;lt;/tt&amp;gt; Remarque, ce n&#039;est que l&#039;utilisation du &#039;&#039;hachage&#039;&#039; &amp;lt;tt&amp;gt;%ENV&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information sur ces variables : &amp;lt;tt&amp;gt;man perlvar&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Branchements conditionnels ===&lt;br /&gt;
&lt;br /&gt;
Ce test classique peut s&#039;écrire de la manière suivante : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;if&#039;&#039;&#039; (test) {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;if&#039;&#039;&#039; (test) {bloc} &#039;&#039;&#039;else&#039;&#039;&#039; {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;if&#039;&#039;&#039; (test) {bloc} &#039;&#039;&#039;elsif&#039;&#039;&#039; (test) {bloc} ... &#039;&#039;&#039;else&#039;&#039;&#039; {bloc}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;test&amp;lt;/tt&amp;gt; étant toute expression qui retourne une valeur. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (!open(F,$FICHIER)) { die &amp;quot;impossible d&#039;ouvrir $FICHIER: $!&amp;quot;; }&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il y a d&#039;autres manières de faire la même chose, vous pouvez utiliser par exemple : &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;instruction &#039;&#039;&#039;if&#039;&#039;&#039; test;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| exécute l&#039;instruction si le test est vrai. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;exemple&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;die &amp;quot;impossible d&#039;ouvrir $FICHIER: $!&amp;quot; &#039;&#039;&#039;if&#039;&#039;&#039; !open(F,$FICHIER);&amp;lt;/tt&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;TOP&amp;quot;&lt;br /&gt;
| &amp;lt;tt&amp;gt;instruction &#039;&#039;&#039;unless&#039;&#039;&#039; test;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| exécute l&#039;instruction si le test est faux. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;exemple&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;die &amp;quot;impossible d&#039;ouvrir $FICHIER: $!&amp;quot; &#039;&#039;&#039;unless&#039;&#039;&#039; open(F,$FICHIER);&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;commande1 &#039;&#039;&#039;or&#039;&#039;&#039; commande2;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| exécute la commande1 ; si elle retourne faux, alors la commande2 sera exécutée. Sinon on passe à la suite. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;exemple&amp;lt;/u&amp;gt; : &amp;lt;tt&amp;gt;open(F,$FICHIER) &#039;&#039;&#039;or&#039;&#039;&#039; die &amp;quot;impossible d&#039;ouvrir $FICHIER: $!&amp;quot;;&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;test&#039;&#039;&#039;?&#039;&#039;&#039;commande1&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;:&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;commande2;&amp;lt;/tt&amp;gt;&lt;br /&gt;
| exécute la commande1 si la condition du test est remplie, sinon il exécute la commande2.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Note&amp;lt;/u&amp;gt; : Pour ceux qui connaissent, il n&#039;y a pas d&#039;équivalent au &#039;&amp;lt;tt&amp;gt;case&amp;lt;/tt&amp;gt;&#039; ou &#039;&amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt;&#039;. Il y a plusieurs façons de faire, notamment utiliser &amp;lt;tt&amp;gt;if elsif ... else&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;man perlsyn&amp;lt;/tt&amp;gt; vous donnera plus d&#039;informations. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Les boucles ===&lt;br /&gt;
&lt;br /&gt;
==== For et foreach ====&lt;br /&gt;
&lt;br /&gt;
Il y a deux types de boucles for, le for &#039;style C&#039;, et le for/foreach Perl.&lt;br /&gt;
&lt;br /&gt;
===== for/foreach Perl =====&lt;br /&gt;
&lt;br /&gt;
Dans ce cas, for et foreach sont synonymes. On peut utiliser l&#039;un ou l&#039;autre pour améliorer la lecture, par habitude, etc.&lt;br /&gt;
&lt;br /&gt;
Pour aller de 1 à 9 : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;for&#039;&#039;&#039; $cpt (1 .. 9) {bloc} &amp;lt;/tt&amp;gt;ou&amp;lt;tt&amp;gt; &#039;&#039;&#039;foreach&#039;&#039;&#039; $cpt (1 .. 9) {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;(dans &amp;lt;tt&amp;gt;{bloc}&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;$cpt&amp;lt;/tt&amp;gt; prend successivement les valeurs de 1 à 9) &amp;lt;br /&amp;gt;ou &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;for&#039;&#039;&#039; (1 .. 9) {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;ici, à chaque itération, la variable par défaut &amp;lt;tt&amp;gt;$_&amp;lt;/tt&amp;gt; prend la valeur suivante.&lt;br /&gt;
&lt;br /&gt;
Pour parcourir chaque éléments d&#039;un tableau : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;foreach&#039;&#039;&#039; $variable (@tableau) {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;A chaque itération, &amp;lt;tt&amp;gt;$variable&amp;lt;/tt&amp;gt; prendra la valeur suivante de &amp;lt;tt&amp;gt;@tableau&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;Si on omet &amp;lt;tt&amp;gt;$variable&amp;lt;/tt&amp;gt;, alors la valeur de l&#039;élément sera stocké dans la variable &amp;lt;tt&amp;gt;$_&amp;lt;/tt&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;foreach&#039;&#039;&#039; (@tableau) {bloc}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : l&#039;écriture &amp;lt;tt&amp;gt;1..9&amp;lt;/tt&amp;gt; définit en réalité un tableau de 9 éléments (1,2,3,4,5,6,7,8,9).&lt;br /&gt;
&lt;br /&gt;
===== for &#039;style C&#039; =====&lt;br /&gt;
&lt;br /&gt;
La construction &#039;classique&#039; à la C est possible, mais tellement moins Perl... &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;for&#039;&#039;&#039; ($cpt=1 ; $cpt &amp;lt; 10 ; $cpt++) {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Cette construction est néanmoins très puissante, et permet de faire beaucoup plus de choses que de simples itérations... A vous de voir !&lt;br /&gt;
&lt;br /&gt;
A noter que dans les exemples ci-dessus, les variables $cpt ou $variable sont locales à la boucle. Si elles doivent être déclarées, vous pouvez les faire précéder du mot clef &amp;lt;tt&amp;gt;my&amp;lt;/tt&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;for &#039;&#039;&#039;my&#039;&#039;&#039; $cpt (1 .. 9) {bloc}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;for (&#039;&#039;&#039;my&#039;&#039;&#039; $cpt=1 ; $cpt &amp;lt; 10 ; $cpt++) {bloc}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== While ====&lt;br /&gt;
&lt;br /&gt;
Les boucles while se construisent comme suit : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039; (test) {bloc1}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039; (test) {bloc1} &#039;&#039;&#039;continue&#039;&#039;&#039; {bloc2}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le bloc1 puis le bloc2 sera exécuté tant que le test est vrai.&lt;br /&gt;
&lt;br /&gt;
L&#039;exécution des boucles peut être pilotée à l&#039;intérieur des blocs par les commandes &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;last&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;redo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;next&amp;lt;/tt&amp;gt; lance l&#039;itération suivante de la boucle. Le bloc continue est exécuté puis la boucle redémarre.&lt;br /&gt;
* &amp;lt;tt&amp;gt;last&amp;lt;/tt&amp;gt; sort de la boucle, sans exécuter le bloc continue.&lt;br /&gt;
* &amp;lt;tt&amp;gt;redo&amp;lt;/tt&amp;gt; relance l&#039;itération de la boucle, sans exécuter le bloc continue ni le test.&lt;br /&gt;
&lt;br /&gt;
Par exemple, le code suivant lit l&#039;entrée standard, et ignore les commentaires (lignes commençant par #)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039; (&amp;lt;STDIN&amp;gt;) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    &#039;&#039;&#039;next&#039;&#039;&#039; if /^#/;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Autre exemple, une itération de 1 à 9&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$cpt = 1;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039; ($cpt &amp;lt; 10) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  $cpt++;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ou bien :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;tt&amp;gt;$cpt = 1;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039; ($cpt &amp;lt; 10) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;continue&#039;&#039;&#039; {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  $cpt++;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information sur ces constructions : &amp;lt;tt&amp;gt;man perlsyn&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Les fonctions et procédures ===&lt;br /&gt;
&lt;br /&gt;
==== Déclaration des fonctions ====&lt;br /&gt;
&lt;br /&gt;
Une fonction peut être déclarée n&#039;importe où dans le script Perl, mais pour des questions de lisibilité, il est préférable de déclarer les fonctions regroupées soit en début, soit en fin de script. &amp;lt;br /&amp;gt;On peut pré-déclarer les fonctions par : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;sub&#039;&#039;&#039; mafonction;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;ou les déclarer directement par : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;sub&#039;&#039;&#039; mafonction {bloc}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Passage de paramètres ====&lt;br /&gt;
&lt;br /&gt;
Les paramètres sont passés comme une liste de valeurs scalaires (nombre, chaîne...) &amp;lt;u&amp;gt;à plat&amp;lt;/u&amp;gt;. &amp;lt;br /&amp;gt;Par exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ma_fonction($variable, &amp;quot;chaîne&amp;quot;);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour lire valeur des paramètres passés dans la fonction, il suffit de lire la variable &amp;lt;tt&amp;gt;@_ &amp;lt;/tt&amp;gt;qui est le tableau contenant les paramètres. &amp;lt;br /&amp;gt;Une façon simple de les lire est d&#039;écrire en début de fonction : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;my &#039;&#039;&#039;($variable, $chaine) = @_;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;On peut aussi récupérer les arguments en dépilant les éléments du tableau &amp;lt;tt&amp;gt;@_&amp;lt;/tt&amp;gt; avec la commande &amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;my $variable = shift @_;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;qui peut s&#039;abréger en &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;my $variable = shift;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;car le tableau &amp;lt;tt&amp;gt;@_&amp;lt;/tt&amp;gt; est l&#039;argument par défaut de shift.&lt;br /&gt;
&lt;br /&gt;
Les paramètres sont passés &#039;&#039;&#039;par valeur&#039;&#039;&#039;. Pour pouvoir modifier le contenu d&#039;une variable passée en paramètre à une fonction, il faut passer à cette fonction une &#039;&#039;référence&#039;&#039; sur la variable (on parle de passage &#039;&#039;&#039;par référence&#039;&#039;&#039;). Une référence est un type scalaire particulier qui permet de se &#039;&#039;référer&#039;&#039; à une variable. La notation consiste à faire précéder la variable par un caractère &#039;&amp;lt;tt&amp;gt;\&amp;lt;/tt&amp;gt;&#039;. Pour récupérer la variable cachée derrière la référence (ou &#039;&#039;déréférencer&#039;&#039;), il faut faire précéder la référence du caractère de type correspondant, et optionnellement entourer la référence d&#039;accolades. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;Exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$a = 1;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$b = \$a;       # $b&amp;lt;/tt&amp;gt; est une référence à &amp;lt;tt&amp;gt;$a&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$c = $$b + 1;   # $c = 2&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$c = ${$b} + 1; # &amp;lt;/tt&amp;gt;synonyme&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Démonstration&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;sub test&#039;&#039;&#039;1&#039;&#039;&#039; {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    my $a=shift; &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# récupération du paramètre &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    $a += 1;     &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# on ajoute un &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;sub test&#039;&#039;&#039;2&#039;&#039;&#039; {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    my $ref_a=shift;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;    $&#039;&#039;&#039;$ref_a += 1; &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# le premier $ déréférence la référence &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$a = 1;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;print $a;   &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# affiche 1 &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;test&#039;&#039;&#039;1&#039;&#039;&#039;($a);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;print $a;   &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# affiche 1 &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;test&#039;&#039;&#039;2&#039;&#039;&#039;(&#039;&#039;&#039;\&#039;&#039;&#039;$a); &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# &amp;lt;/nowiki&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;\&#039;&#039;&#039;$a&amp;lt;/tt&amp;gt; est une référence sur &amp;lt;tt&amp;gt;$a&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;print $a;   &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# affiche 2 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le passage par référence a aussi pour d&#039;intérêt de pouvoir passer des tableaux ou des hachages en paramètres à une fonction. En effet, on a vu que les paramètres d&#039;une fonction sont passés comme une &#039;&#039;&#039;liste de valeurs scalaires&#039;&#039;&#039; &amp;lt;u&amp;gt;à plat&amp;lt;/u&amp;gt;. Si on désire passer 2 tableaux &amp;lt;tt&amp;gt;@tab1=(1,1,1)&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;@tab2=(2,2)&amp;lt;/tt&amp;gt; à une fonction, et que l&#039;on écrit : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;mafonction (@tab1, @tab2);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;alors perl traduira cela comme : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;mafonction (1,1,1,2,2);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;car il met toutes les valeurs à plat dans une liste. Une fois dans la fonction on sera bien embêté pour savoir distinguer les éléments du premier tableau de ceux du deuxième. &amp;lt;br /&amp;gt;On va donc passer une référence sur chaque tableau : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;mafonction (&#039;&#039;&#039;\&#039;&#039;&#039;@tab1, &#039;&#039;&#039;\&#039;&#039;&#039;@tab2);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;sub liste_gt {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    my ($l1ref, $l2ref) = @_;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    $n1 = &#039;&#039;&#039;@&#039;&#039;&#039;$l1ref; #&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;@$l1ref&amp;lt;/tt&amp;gt; représente le tableau référencé par &amp;lt;tt&amp;gt;$l1ref&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    $n2 = &#039;&#039;&#039;@&#039;&#039;&#039;$l2ref;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    #&amp;lt;/tt&amp;gt; (affecter un tableau dans un scalaire retourne le nombre d&#039;éléments) &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    if ($n1 &amp;gt; $n2) { return 1; }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    else { return 0; }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@tab1 = (1,2,3);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@tab2 = (&amp;quot;a&amp;quot;,2,&amp;quot;r&amp;quot;,5);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (liste_gt(&#039;&#039;&#039;\&#039;&#039;&#039;@tab1, &#039;&#039;&#039;\&#039;&#039;&#039;@tab2)) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    print &amp;quot;tab1 a plus d&#039;éléments que tab2\n&amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;} else {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    print &amp;quot;tab2 a plus d&#039;éléments que tab1\n&amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout cela s&#039;applique de la même façon aux hachages. &amp;lt;br /&amp;gt;Pour plus d&#039;informations sur les références, voir &amp;lt;tt&amp;gt;man perlreftut&amp;lt;/tt&amp;gt; (tutoriel) et &amp;lt;tt&amp;gt;man perlref&amp;lt;/tt&amp;gt; (références).&lt;br /&gt;
&lt;br /&gt;
==== Retour de valeurs ====&lt;br /&gt;
&lt;br /&gt;
Une fonction peut renvoyer une ou des valeurs, grâce à la commande &amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;sub&#039;&#039;&#039; ecrire&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  &#039;&#039;&#039;return&#039;&#039;&#039; $valeur;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ...      &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# renvoie une valeur unique &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  &#039;&#039;&#039;return&#039;&#039;&#039; $valeur1, $valeur2;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ...      &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# renvoie une liste de valeurs &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Cette commande provoque la sortie immédiate du sous-programme pour retourner dans le programme appelant.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;tt&amp;gt;return&amp;lt;/tt&amp;gt;&#039;&#039;&#039; permet de renvoyer une valeur ou une liste de valeurs. Cela permet donc à une fonction de retourner soit un tableau : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@resultat = ma_fonction;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;soit plusieurs valeurs : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;($a, $b) = ma_fonction;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De même que pour le passage de paramètres, la liste de valeur est une liste &amp;quot;à plat&amp;quot;, ce qui signifie que pour retourner plusieurs tableaux, il faut également passer par les références : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;($ref_a, $ref_b) = ma_fonction;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;où &amp;lt;tt&amp;gt;$ref_a&amp;lt;/tt&amp;gt; est une référence sur le tableau &amp;lt;tt&amp;gt;@$ref_a&amp;lt;/tt&amp;gt; et où ma_fonction retourne une liste de deux références. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pour plus d&#039;information sur les fonctions de Perl, voir &amp;lt;tt&amp;gt;man perlsub&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;  &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Les expressions régulières, ou regex ===&lt;br /&gt;
&lt;br /&gt;
Perl est un langage très pratique pour manipuler du texte. Un des éléments qui le rend si adapté à cet usage est la présence des &#039;&#039;expressions régulières&#039;&#039;, qui permettent de déterminer si une chaîne de caractère correspond à un masque prédéfini, d&#039;extraire des éléments d&#039;une chaîne de caractères suivant un masque, de remplacer des parties d&#039;une chaîne suivant un masque, etc. C&#039;est ce masque, défini sous forme d&#039;une chaîne de caractères, que l&#039;on appelle &#039;&#039;expression régulière&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Par exemple, &amp;lt;tt&amp;gt;$a =~ /lea/&amp;lt;/tt&amp;gt; teste si la chaîne &amp;quot;lea&amp;quot; est dans la chaîne $a, &amp;lt;tt&amp;gt;$a =~ /^lea/&amp;lt;/tt&amp;gt; si $a commence par &amp;quot;lea&amp;quot;, &amp;lt;tt&amp;gt;$a =~ /l[eé]a/&amp;lt;/tt&amp;gt; si la chaîne $a contient &amp;quot;lea&amp;quot; ou &amp;quot;léa&amp;quot;...&lt;br /&gt;
&lt;br /&gt;
De prime abord, ce sont des sortes de formules qui semblent ne rien vouloir dire, mais une fois que nous les maîtrisons, elles se révèlent extrêmement pratiques et puissantes.&lt;br /&gt;
&lt;br /&gt;
==== Les éléments composant une expression régulière ====&lt;br /&gt;
&lt;br /&gt;
Les éléments les plus utilisés sont :&lt;br /&gt;
&lt;br /&gt;
* les caractères standards : majuscules, minuscules, chiffres, etc.&lt;br /&gt;
* les méta-caractères : &lt;br /&gt;
** &amp;lt;tt&amp;gt;. &amp;lt;/tt&amp;gt; : représente un caractère quelconque&lt;br /&gt;
** &amp;lt;tt&amp;gt;^ &amp;lt;/tt&amp;gt; : début de la chaîne&lt;br /&gt;
** &amp;lt;tt&amp;gt;$ &amp;lt;/tt&amp;gt; : fin de la chaîne&lt;br /&gt;
** &amp;lt;tt&amp;gt;()&amp;lt;/tt&amp;gt; : groupement et capture (la chaîne qui correspond au masque présent entre les parenthèses est affectée à la variable $1 pour la première parenthèse, $2 pour la seconde, etc. On peut ensuite utiliser ces variables normalement, notamment dans la substitution, voir plus bas)&lt;br /&gt;
** &amp;lt;tt&amp;gt;(?:)&amp;lt;/tt&amp;gt; : groupement sans capture (pas d&#039;affectation aux variables $1, $2...)&lt;br /&gt;
** &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; : classe de caractères (c&#039;est à dire l&#039;un des caractères présent entre les crochets ; on peut de plus spécifier des plages de caractères, par exemple &amp;lt;tt&amp;gt;[a-e]&amp;lt;/tt&amp;gt; correspond à tous les caractères entre a et e ; &amp;lt;tt&amp;gt;[aeiou]&amp;lt;/tt&amp;gt; aux voyelles ; &amp;lt;tt&amp;gt;[aeiou0-9]&amp;lt;/tt&amp;gt; aux voyelles plus aux chiffres...)&lt;br /&gt;
** &amp;lt;tt&amp;gt;| &amp;lt;/tt&amp;gt; : alternance (sorte de ou logique)&lt;br /&gt;
** &amp;lt;tt&amp;gt;\ &amp;lt;/tt&amp;gt; : permet de protéger un caractère réservé (voir ci-dessus) lorsqu&#039;on veut l&#039;utiliser comme caractère standard dans la regex.&lt;br /&gt;
* les caractères spéciaux : &lt;br /&gt;
** &amp;lt;tt&amp;gt;\s&amp;lt;/tt&amp;gt; : représente un espace&lt;br /&gt;
** &amp;lt;tt&amp;gt;\S&amp;lt;/tt&amp;gt; : caractère autre que espace&lt;br /&gt;
** &amp;lt;tt&amp;gt;\n&amp;lt;/tt&amp;gt; : saut de ligne&lt;br /&gt;
** &amp;lt;tt&amp;gt;\r&amp;lt;/tt&amp;gt; : retour chariot (les lignes des fichiers Windows se terminent par \r\n, et par \n sous Unix). Pour faire du code portable, il vaut mieux utiliser &amp;lt;tt&amp;gt;$/&amp;lt;/tt&amp;gt; qui représente la fin de ligne (voir [#var_particulieres variables spéciales]).&lt;br /&gt;
** &amp;lt;tt&amp;gt;\t&amp;lt;/tt&amp;gt; : tabulation&lt;br /&gt;
** &amp;lt;tt&amp;gt;\d&amp;lt;/tt&amp;gt; : un chiffre (=&amp;lt;tt&amp;gt;[0-9]&amp;lt;/tt&amp;gt;)&lt;br /&gt;
** &amp;lt;tt&amp;gt;\w&amp;lt;/tt&amp;gt; : alphanumérique (=&amp;lt;tt&amp;gt;[0-9a-zA-Z_]&amp;lt;/tt&amp;gt; plus les accents, etc. si on précise &amp;lt;tt&amp;gt;use locale;&amp;lt;/tt&amp;gt;)&lt;br /&gt;
** plus de nombreux autres...&lt;br /&gt;
* les quantifieurs (ils suivent un caractère ou un méta-caractère afin d&#039;en représenter le nombre que l&#039;on cherche) : &lt;br /&gt;
** &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; : de 0 à n&lt;br /&gt;
** + : de 1 à n&lt;br /&gt;
** ? : 0 ou 1&lt;br /&gt;
** {n} : exactement n&lt;br /&gt;
** {n,} : au moins n&lt;br /&gt;
** {n,m} : entre n et m par défaut, les quantifieurs sont &amp;quot;gourmands&amp;quot;, c&#039;est à dire qu&#039;ils recherchent un maximum de caractères tant que le reste du masque correspond. Afin de rechercher un minimum de caractère, il faut faire suivre le quantifieur de &#039;?&#039;, par exemple &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;*?&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;{n,}?&amp;lt;/tt&amp;gt;, etc. &lt;br /&gt;
* les assertions de largeur nulle (i.e. ne représentant pas un caractère) &lt;br /&gt;
** \b : correspond à une limite de mot&lt;br /&gt;
** \B : correspond à une non limite de mot (i.e. intérieur !)&lt;br /&gt;
** (?!pattern) : assertion négative en avant. Par exemple, /toto(?!titi)/ teste si la chaîne contient &amp;quot;toto&amp;quot;, non &amp;lt;u&amp;gt;suivi&amp;lt;/u&amp;gt; de &amp;quot;titi&amp;quot;. &lt;br /&gt;
** (?&amp;lt;!pattern) : assertion négative en arrière. Par exemple, /(?&amp;lt;!titi)toto/ teste si la chaîne contient &amp;quot;toto&amp;quot;, non &amp;lt;u&amp;gt;précédé&amp;lt;/u&amp;gt; de &amp;quot;titi&amp;quot;. La largeur de &amp;quot;titi&amp;quot; doit être fixe (i.e. toujours le même nombre de caractères). &lt;br /&gt;
** ...&lt;br /&gt;
&lt;br /&gt;
==== Les différentes utilisations des expressions régulières ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&#039;&#039;&#039;m&#039;&#039;&#039;/regex/&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;/regex/&amp;lt;/tt&amp;gt; (sans le &#039;&#039;&#039;m&#039;&#039;&#039;) &#039;&#039;&#039;teste&#039;&#039;&#039; si une chaîne correspond (&#039;&#039;match&#039;&#039;) à une regex donnée. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;s&#039;&#039;&#039;/regex/substitution/&amp;lt;/tt&amp;gt; &#039;&#039;&#039;remplace&#039;&#039;&#039; la partie de la chaîne correspondant à la regex par la substitution.&lt;br /&gt;
&lt;br /&gt;
Pour appliquer un test m// ou une substitution s/// à une chaîne de caractères, on utilise l&#039;opérateur =~ ou !~. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;Par exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if ($s &#039;&#039;&#039;=~&#039;&#039;&#039; /win(dows)?/) { kickban(); }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;teste si la chaîne $s contient &amp;quot;win&amp;quot; ou &amp;quot;windows&amp;quot;. &amp;lt;br /&amp;gt;Si on ne précise pas de chaîne, le test se fait sur la variable par défaut $_ : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (/win(dows)?/) { kickban(); }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;teste si $_ contient &amp;quot;win&amp;quot; ou &amp;quot;windows&amp;quot;. &amp;lt;br /&amp;gt;L&#039;opérateur &amp;lt;tt&amp;gt;!~&amp;lt;/tt&amp;gt; correspond quant à lui à la négation : &amp;lt;tt&amp;gt;$s !~ /coin/&amp;lt;/tt&amp;gt; teste si la chaîne $s ne contient pas &amp;quot;coin&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== options =====&lt;br /&gt;
&lt;br /&gt;
Les expressions régulières peuvent de plus être suivies de modifieurs ou options, qui en modifient le comportement, notamment :&lt;br /&gt;
&lt;br /&gt;
* g : recherche globalement, i.e. ne s&#039;arrête pas à la première occurrence.&lt;br /&gt;
* i : recherche insensible à la casse des caractères (i.e. majuscules/minuscules)&lt;br /&gt;
* m : traite la chaîne comme des lignes multiples (lorsqu&#039;elle contient des retours à la ligne). ^ et $ correspondent dans ce cas à un début de ligne et une fin de ligne.&lt;br /&gt;
* s : traite la chaîne comme une seule ligne. Dans ce cas, le méta-caractère &amp;quot;.&amp;quot; peut correspondre à &amp;quot;\n&amp;quot; ce qui n&#039;est pas le cas normalement.&lt;br /&gt;
* x : permet d&#039;insérer des espaces voire des commentaires dans un masque.&lt;br /&gt;
* e : uniquement pour s///, traite la substitution comme du code perl : elle est interprétée par perl avant d&#039;être substituée.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Par exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;quot;Bonjour Léa&amp;quot; =~ m/jour/; # correspond&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;quot;Bonjour Léa&amp;quot; =~ m/Jour/; # ne correspond pas&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;quot;Bonjour Léa&amp;quot; =~ m/Jour/i; # correspond&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== groupement et capture =====&lt;br /&gt;
&lt;br /&gt;
Si une partie d&#039;une regex est entre parenthèses, alors la partie de la chaîne qui correspond à cette parenthèse sera affectée à la variable $1 (on dit &amp;quot;capturée&amp;quot;). Si une deuxième parenthèse est présente dans la regex, la variable $2 sera utilisée, et ainsi de suite. Si la parenthèse commence par ?: alors il n&#039;y aura pas d&#039;affectation à une variable $1, $2, etc. &amp;lt;br /&amp;gt;Ainsi : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (/win&#039;&#039;&#039;(?:&#039;&#039;&#039;dows&#039;&#039;&#039;)&#039;&#039;&#039;?\s&#039;&#039;&#039;(&#039;&#039;&#039;..&#039;&#039;&#039;)&#039;&#039;&#039;/i) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  if (&#039;&#039;&#039;$1&#039;&#039;&#039; eq &amp;quot;xp&amp;quot;) { kickban(); }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  else { kick(); }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;teste si $_ contient &amp;quot;win&amp;quot; ou &amp;quot;windows&amp;quot;, suivi d&#039;un espace, puis de 2 caractères, que l&#039;on va capturer dans &amp;lt;tt&amp;gt;$1&amp;lt;/tt&amp;gt;. La première parenthèse &amp;lt;tt&amp;gt;(?:dows)&amp;lt;/tt&amp;gt; permet de regrouper les quatre caractères &amp;quot;dows&amp;quot; afin de leur appliquer le quantifieur &#039;?&#039; (0 ou 1).&lt;br /&gt;
&lt;br /&gt;
Les captures $1, $2... peuvent être utilisées lors d&#039;une substitution : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$s =~ /win&#039;&#039;&#039;(?:&#039;&#039;&#039;dows&#039;&#039;&#039;)&#039;&#039;&#039;?\s&#039;&#039;&#039;(&#039;&#039;&#039;..&#039;&#039;&#039;)&#039;&#039;&#039;/winblows $1/&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Tester si une chaîne correspond à un masque donné : m// ou // ====&lt;br /&gt;
&lt;br /&gt;
Par exemple, pour tester si une chaîne contient le mot &amp;quot;lea&amp;quot; (le &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; de la fin permet de ne pas différencier majuscules et minuscules) : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (/lea/i) ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour tester si une chaîne commence par la lettre &#039;a&#039;, on peut faire : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (/&#039;&#039;&#039;^&#039;&#039;&#039;a/) ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour tester si une chaîne se termine par &#039;z&#039; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (/z&#039;&#039;&#039;$&#039;&#039;&#039;/) ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enfin pour tester si une chaîne contient un quadruplet héxadécimal (i.e. 4 chiffres de 0 à 9 ou A à F) : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;if (/[0-9A-F]{4}/) ...&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici, par défaut, c&#039;est la valeur contenu dans &amp;lt;tt&amp;gt;$_&amp;lt;/tt&amp;gt; qui est utilisée pour le test. Et bien entendu, nous pouvons compliquer à loisir l&#039;expression régulière, et utiliser le groupement (voir plus haut) afin de récupérer les valeurs trouvées dans les chaînes pour s&#039;en servir par la suite. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== Substituer une partie d&#039;une chaîne à une autre : s/// ====&lt;br /&gt;
&lt;br /&gt;
Rappel : la syntaxe est &amp;lt;tt&amp;gt;s/regex décrivant l&#039;élément à remplacer/élément remplaçant/options&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Exemples&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;s&#039;&#039;&#039;/a/b/;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Cette commande va remplacer le premier &#039;a&#039; de la ligne par &#039;b&#039;. Pour remplacer tous les &#039;a&#039; faire : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;s&#039;&#039;&#039;/a/b/&#039;&#039;&#039;g&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Si en plus nous voulons que cela ne fasse pas la différence entre les majuscules et les minuscules (&#039;&#039;case sensitive&#039;&#039;), faire &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;s&#039;&#039;&#039;/a/b/&#039;&#039;&#039;gi&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Pour remplacer tous les ensembles de caractères commençant par &#039;a&#039;, finissant par &#039;e&#039; et avec au moins un caractère au milieu sans être sensitif par &#039;toto&#039;, faire : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;s&#039;&#039;&#039;/a&#039;&#039;&#039;.*&#039;&#039;&#039;e/toto/&#039;&#039;&#039;gi&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==== La traduction : tr/// ====&lt;br /&gt;
&lt;br /&gt;
Cette construction &amp;quot;à la regex&amp;quot; permet de remplacer des caractères par d&#039;autres dans une chaîne, à la manière de la commande unix &#039;tr&#039;. &amp;lt;br /&amp;gt;La syntaxe est &amp;lt;tt&amp;gt;&#039;&#039;&#039;tr&#039;&#039;&#039;/éléments à traduire/éléments traduits/&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Ou &amp;lt;tt&amp;gt;&#039;&#039;&#039;y&#039;&#039;&#039;/éléments à traduire/éléments traduits/&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$variable &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;tr&#039;&#039;&#039;/a-b/A-B/;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Cela va transformer tous les &#039;a&#039; et &#039;b&#039; minuscules en majuscules.&lt;br /&gt;
&lt;br /&gt;
Plus d&#039;info sur : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;man perlre&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;man perlretut&amp;lt;/tt&amp;gt; (le tutoriel sur les regex, une bonne lecture !) &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Structures de données complexes ===&lt;br /&gt;
&lt;br /&gt;
==== Tableaux et tables de hachage multidimensionnels ====&lt;br /&gt;
&lt;br /&gt;
On a vu plus haut que les tableaux Perl ne possèdent qu&#039;une seule dimension (il ne peuvent contenir que des éléments de type scalaire). On a aussi vu [[#Passage de paramètres|plus haut]] l&#039;existence de références, type scalaire particulier qui permet de se &#039;&#039;référer&#039;&#039; à une variable, donc en l&#039;occurence à un tableau. &amp;lt;br /&amp;gt;Ainsi pour représenter la matrice &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 0 1 2&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 3 4 5&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; 6 7 8&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Nous allons pouvoir faire : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@ligne1 = (0, 1, 2);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@ligne2 = (3, 4, 5);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@ligne3 = (6, 7, 8);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@matrice = (&#039;&#039;&#039;\&#039;&#039;&#039;@ligne1, &#039;&#039;&#039;\&#039;&#039;&#039;@ligne2, &#039;&#039;&#039;\&#039;&#039;&#039;@ligne3);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Perl introduit une nouvelle notation pour ce faire : au lieu d&#039;entourer la liste avec des parenthèses, nous allons le faire avec des crochets, ce qui aura pour effet de retourner une référence : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$ligne1_ref = [0, 1, 2];&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;etc...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;ou plus simplement : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@matrice = (&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; [0, 1, 2],&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; [3, 4, 5],&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; [6, 7, 8],&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Dans tous ces cas, @matrice est un tableau de trois éléments, qui sont chacun une référence vers un autre tableau. &amp;lt;tt&amp;gt;$matrice[1]&amp;lt;/tt&amp;gt; est une référence sur la 2&amp;lt;sup&amp;gt;ème&amp;lt;/sup&amp;gt; ligne de la matrice.&lt;br /&gt;
&lt;br /&gt;
Afin d&#039;accéder aux éléments de la matrice, nous pouvons utiliser une nouvelle notation : la flèche &#039;&amp;lt;tt&amp;gt;-&amp;gt;&amp;lt;/tt&amp;gt;&#039;. &amp;lt;br /&amp;gt;En effet, afin d&#039;accéder au 3&amp;lt;sup&amp;gt;ème&amp;lt;/sup&amp;gt; élément de &amp;lt;tt&amp;gt;$ligne1_ref&amp;lt;/tt&amp;gt; définie plus haut, nous utiliserons &amp;lt;tt&amp;gt;$ligne1_ref&#039;&#039;&#039;-&amp;gt;&#039;&#039;&#039;[2]&amp;lt;/tt&amp;gt; (ce qui est synonyme de &amp;lt;tt&amp;gt;${$ligne1_ref}[2]&amp;lt;/tt&amp;gt;.) &amp;lt;br /&amp;gt;Ainsi, afin d&#039;accéder au &#039;5&#039; dans notre matrice, nous ferons : &amp;lt;tt&amp;gt;$matrice[1]&#039;&#039;&#039;-&amp;gt;&#039;&#039;&#039;[2]&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;Mais... Perl est gentil avec nous, car entre deux indices de tableau, la flèche est optionnelle ! Donc nous pouvons écrire : &amp;lt;tt&amp;gt;$matrice[1][2]&amp;lt;/tt&amp;gt;, ce qui ressemble maintenant à un tableau bi-dimensionnel.&lt;br /&gt;
&lt;br /&gt;
De même, si $hash_ref est une référence vers un hachage, &amp;lt;tt&amp;gt;$hash_ref-&amp;gt;{&#039;nom&#039;}&amp;lt;/tt&amp;gt; renverra l&#039;élément du hachage indexé par &#039;nom&#039;.&lt;br /&gt;
&lt;br /&gt;
L&#039;ensemble tableaux, hachages et références peut bien sûr être mixé dans l&#039;ordre qui vous plaira. Par exemple, pour réaliser un tableau de personnes, nous écrirons : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@staff = (&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; [ prenom =&amp;gt; &amp;quot;jice&amp;quot;, nom =&amp;gt; &amp;quot;cardot&amp;quot; ],&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; [ prenom =&amp;gt; &amp;quot;fred&amp;quot;, nom =&amp;gt; &amp;quot;bonnaud&amp;quot; ],&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt; [ prenom =&amp;gt; &amp;quot;serge&amp;quot;, nom =&amp;gt; &amp;quot;tchesmeli&amp;quot; ],&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;et pour accéder au prénom de la première personne, nous ferons : &amp;lt;tt&amp;gt;$staff[0]&#039;&#039;&#039;-&amp;gt;&#039;&#039;&#039;{&#039;prenom&#039;}&amp;lt;/tt&amp;gt;(meuh non je ne suis pas mégalo ;) ou &amp;lt;tt&amp;gt;$staff[0]{&#039;prenom&#039;}&amp;lt;/tt&amp;gt; car ici aussi la flèche est optionnelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Notes&amp;lt;/u&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
* pour manipuler les tableaux, les fonctions intéressantes sont notamment : &amp;lt;tt&amp;gt;push&amp;lt;/tt&amp;gt; pour ajouter un élément en fin de tableau, &amp;lt;tt&amp;gt;pop&amp;lt;/tt&amp;gt; pour récupérer le dernier élément et &amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt; pour récupérer le premier élément. &amp;lt;tt&amp;gt;pop&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;shift&amp;lt;/tt&amp;gt; retournent cet élément, et le suppriment du tableau.&lt;br /&gt;
* en contexte scalaire, évaluer un tableau ou un hachage retourne son nombre d&#039;éléments. Ainsi &amp;lt;tt&amp;gt;$nb_elem = @tableau&amp;lt;/tt&amp;gt; mettra dans &amp;lt;tt&amp;gt;$nb_elem&amp;lt;/tt&amp;gt; le nombre d&#039;éléments de &amp;lt;tt&amp;gt;@tableau&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Les références symboliques ===&lt;br /&gt;
&lt;br /&gt;
On a vu [[#Passage de paramètres|ci-dessus]] une utilisation des références, pour le passage et le retour de valeurs dans les fonctions. On [[#Structures de données complexes|vient de voir]] également leur utilité pour travailler avec des structures de données complexes.&lt;br /&gt;
&lt;br /&gt;
Les références peuvent aussi servir dans un autre contexte : si vous déréférencez une variable contenant une valeur scalaire plutôt qu&#039;un référence vers une autre variable, elle sera considérée comme une référence symbolique, c&#039;est à dire que la valeur scalaire sera utilisée en tant que nom de la variable. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;Exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$test = &amp;quot;toto&amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$$test = 144;     #&amp;lt;/tt&amp;gt; affecte 144 à $toto &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;${$test} = 12;    #&amp;lt;/tt&amp;gt; affecte 12 à $toto &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$test-&amp;gt;[1] = 12;  #&amp;lt;/tt&amp;gt; affecte 12 à $toto[1] &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@$test = (1,2,3); #&amp;lt;/tt&amp;gt; affecte le tableau @toto&lt;br /&gt;
&lt;br /&gt;
Cela peut aller beaucoup plus loin, car vous pouvez mettre une chaîne de caractères entre les accolades : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;${$test x 2} = 12;   #&amp;lt;/tt&amp;gt; affecte 12 à $totototo &amp;lt;br /&amp;gt;$titi = 2; &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;${&amp;quot;$toto$titi&amp;quot;} = 2; #&amp;lt;/tt&amp;gt; affecte 2 à $toto2 &amp;lt;br /&amp;gt;etc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Remarque&amp;lt;/u&amp;gt; : l&#039;utilisation des références symboliques avec &amp;lt;tt&amp;gt;use strict;&amp;lt;/tt&amp;gt; (tel que préconisé au début de l&#039;article) n&#039;est pas possible. Pour contourner ce problème, il faut appeler l&#039;instruction &amp;lt;tt&amp;gt;no strict &#039;refs&#039;;&amp;lt;/tt&amp;gt; dans le bloc où on veut utiliser les références symboliques.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Autre exemple d&#039;utilisation&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$min = 12;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$max = 144;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;while (&amp;lt;FICHIER&amp;gt;) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  if (/^([A-Z]+)\ (\d+)\ (\d+)\ (\d+)$/) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    #&amp;lt;/tt&amp;gt; les masques ont affecté $1, $2, $3 et $4 (voir [#regex_capture groupement/capture]) &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    print &amp;quot;$1: &amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    #&amp;lt;/tt&amp;gt; on va effectuer une même opération sur $2, $3 et $4 : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    for $i (2 .. 4) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;      no strict &#039;refs&#039;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;      #&amp;lt;/tt&amp;gt; on utilise les références symboliques : si $i = 2, alors $$i est $2 &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;      if (&#039;&#039;&#039;$$i&#039;&#039;&#039; &amp;gt; $max) print &amp;quot;sup &amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;      elseif (&#039;&#039;&#039;$$i&#039;&#039;&#039; &amp;lt; $min) print &amp;quot;inf &amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;      else print &amp;quot;ok &amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;    }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  }&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manipulation de fichiers ===&lt;br /&gt;
&lt;br /&gt;
Comme toujours en Perl, il y a plusieurs moyens de faire une même opération.&lt;br /&gt;
&lt;br /&gt;
==== Ouverture &amp;quot;à la shell&amp;quot; : ====&lt;br /&gt;
&lt;br /&gt;
Cette façon de faire offrant un moyen simple d&#039;ouvrir un fichier en lecture / écriture est empruntée du shell. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039;(FILE, &amp;quot;&amp;lt; nom du fichier&amp;quot;); &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# ouvre en lecture &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039;(FILE, &amp;quot;  nom du fichier&amp;quot;); &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# idem &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039;(FILE, &amp;quot;&amp;gt; nom du fichier&#039;); &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# ouvre en écriture &amp;lt;/nowiki&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039;(FILE, &amp;quot;&amp;gt;&amp;gt;nom du fichier&#039;); &amp;lt;/tt&amp;gt;&amp;lt;nowiki&amp;gt;# ouvre en ajout &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque : le fichier &amp;quot;moins&amp;quot; correspond à l&#039;entrée standard &#039;&#039;stdin&#039;&#039; en lecture et à la sortie standard &#039;&#039;stdout&#039;&#039; en écriture. Par exemple  &amp;lt;tt&amp;gt;open(SORTIE,&amp;quot;&amp;gt;-&amp;quot;)&amp;lt;/tt&amp;gt; ouvre la sortie standard.&lt;br /&gt;
&lt;br /&gt;
==== Ouverture &amp;quot;à la C&amp;quot; : ====&lt;br /&gt;
&lt;br /&gt;
La fonction &#039;&#039;&#039;&amp;lt;tt&amp;gt;sysopen&amp;lt;/tt&amp;gt;&#039;&#039;&#039; de Perl correspond à l&#039;appel système open(2) du C. Cela permet une plus grande maîtrise sur l&#039;ouverture des fichiers, au prix d&#039;une plus grande complexité. &amp;lt;br /&amp;gt;Synoptique : &amp;lt;tt&amp;gt;sysopen DESCRIPTEUR, CHEMIN, FLAGS, [MASQUE]&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;MASQUE&amp;lt;/tt&amp;gt; correspond au masque octal des permissions du fichier (utile pour la création d&#039;un fichier), combiné avec l&#039;umask du processus perl. voir [../admin/permissions.php3 l&#039;article sur les permissions]. &amp;lt;br /&amp;gt;Je vous renvoie vers un cours de C pour la signification des exemples suivants, et vous donne la correspondance avec l&#039;open &amp;quot;à la shell&amp;quot;. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;80%&amp;quot; border=&amp;quot;BORDER&amp;quot;&lt;br /&gt;
! à la Shell&lt;br /&gt;
! à la C&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;open(F, &amp;quot;&amp;lt; $chemin&amp;quot;);&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;sysopen(F, $chemin, O_RDONLY);&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;open(F, &amp;quot;&amp;gt; $chemin&amp;quot;);&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;sysopen(F, $chemin, O_WRONLY | O_TRUNC | O_CREAT);&amp;lt;/tt&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tt&amp;gt;open(F, &amp;quot;&amp;gt;&amp;gt; $chemin&amp;quot;);&amp;lt;/tt&amp;gt;&lt;br /&gt;
| &amp;lt;tt&amp;gt;sysopen(F, $chemin, O_WRONLY | O_APPEND | O_CREAT);&amp;lt;/tt&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bien sûr, sysopen permet de faire plus de choses que le simple open(), en jouant sur les flags ci-dessus et O_RDWR, O_RDONLY, O_EXCL, O_NONBLOCK, O_BINARY. Pour plus d&#039;informations, voir &amp;lt;tt&amp;gt;man perlopentut&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;man 2 open&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Fermer un fichier ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&#039;&#039;&#039;close&#039;&#039;&#039;(FILE);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;FILE&amp;lt;/tt&amp;gt; étant le descripteur du fichier ouvert.&lt;br /&gt;
&lt;br /&gt;
==== Descripteurs de fichier spéciaux ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;STDIN&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;STDOUT&amp;lt;/tt&amp;gt; sont définis dès le lancement de votre programme. Ils correspondent respectivement à l&#039;entrée et à la sortie standard. Rien ne vous empêche de les redéfinir, en les ouvrant sur un autre fichier, par exemple : &amp;lt;tt&amp;gt;open(STDIN, &amp;quot;mon_fichier&amp;quot;);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Lire dans un fichier (l&#039;opérateur diamant) ====&lt;br /&gt;
&lt;br /&gt;
À chaque appel, &amp;lt;tt&amp;gt;&#039;&#039;&#039;&amp;lt;&#039;&#039;&#039;DESCRIPTEUR DE FICHIER&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&amp;lt;/tt&amp;gt; (on appelle &#039;&#039;&#039;&amp;lt;tt&amp;gt;&amp;lt;&amp;gt;&amp;lt;/tt&amp;gt;&#039;&#039;&#039; l&#039;opérateur &amp;quot;diamant&amp;quot;) retourne la ligne suivante du fichier (en fait jusqu&#039;à la fin de ligne définie par $/, voir le paragraphe sur les [#var_particulieres variables prédéfinies].), ou renvoie &#039;&#039;faux&#039;&#039; en fin de fichier. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;open (F, &amp;quot;mon_fichier&amp;quot;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$premiere_ligne = &#039;&#039;&#039;&amp;lt;&#039;&#039;&#039;F&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;while (&#039;&#039;&#039;&amp;lt;&#039;&#039;&#039;F&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ... &amp;lt;/tt&amp;gt;traitement en fonction de $_&amp;lt;tt&amp;gt; ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;close(F);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;exemple&amp;lt;/u&amp;gt; : pour lire tout un fichier dans une variable : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;open (F, &amp;quot;mon_fichier&amp;quot;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;undef $/;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$contenu_fichier = &#039;&#039;&#039;&amp;lt;&#039;&#039;&#039;F&#039;&#039;&#039;&amp;gt;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;close(F);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La lecture sur l&#039;entrée standard est extrêmement simplifiée, car &amp;lt;tt&amp;gt;STDIN&amp;lt;/tt&amp;gt; est déjà ouvert, et &amp;lt;tt&amp;gt;&amp;lt;STDIN&amp;gt;&amp;lt;/tt&amp;gt; et &amp;lt;tt&amp;gt;&amp;lt;&amp;gt;&amp;lt;/tt&amp;gt; sont synonymes. Ainsi, il suffit de faire : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;while (&#039;&#039;&#039;&amp;lt;&amp;gt;&#039;&#039;&#039;) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  ... traitement de la ligne en cours ...&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Écrire dans un fichier ====&lt;br /&gt;
&lt;br /&gt;
Il suffit de spécifier à la commande &amp;lt;tt&amp;gt;print&amp;lt;/tt&amp;gt; ou &amp;lt;tt&amp;gt;printf&amp;lt;/tt&amp;gt; le descripteur de fichier à utiliser. &amp;lt;br /&amp;gt;&amp;lt;u&amp;gt;Exemple&amp;lt;/u&amp;gt; : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;open(FLOG, &amp;quot;&amp;gt;&amp;gt; fichier.log&amp;quot;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;print &#039;&#039;&#039;FLOG&#039;&#039;&#039; &amp;quot;nouveau log\n&amp;quot;;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;close(FLOG);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Quelques autres commandes utiles ==&lt;br /&gt;
&lt;br /&gt;
voir &amp;lt;tt&amp;gt;man perlfunc&amp;lt;/tt&amp;gt; pour la liste exhaustive des commandes intégrées de Perl.&lt;br /&gt;
&lt;br /&gt;
=== split ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;split&amp;lt;/tt&amp;gt; correspond en partie à la fonction &amp;lt;tt&amp;gt;cut&amp;lt;/tt&amp;gt; en shell. Elle permet de découper une chaîne de caractères. &amp;lt;br /&amp;gt;Exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;($variable, @tableau) = &#039;&#039;&#039;split&#039;&#039;&#039; (&amp;quot;:&amp;quot;, &amp;quot;prenom:nom:age:adresse:ville:telephone&amp;quot;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Renvoie &amp;quot;prenom&amp;quot; dans &amp;lt;tt&amp;gt;$variable&amp;lt;/tt&amp;gt; et le reste dans des cases distinctes du tableau &amp;lt;tt&amp;gt;@tableau&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== systeme ou exec ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;exec&amp;lt;/tt&amp;gt; permet de lancer un programme extérieur. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;system&amp;lt;/tt&amp;gt; de même que &amp;lt;tt&amp;gt;exec&amp;lt;/tt&amp;gt;, mais produit un &#039;&#039;fork&#039;&#039;, processus fils. &amp;lt;br /&amp;gt;Exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;@args = (&amp;quot;ls&amp;quot;, &amp;quot;-lrt&amp;quot;, &amp;quot;toto*&amp;quot;);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;system&#039;&#039;&#039;(@args);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Cela va lancer la commande : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;ls -lrt toto*&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Attention, l&#039;utilisation de ces commandes rend votre script beaucoup moins portable ! En général, il y a moyen de tout faire en Perl, il faut éviter de recourir à ces fonctions.&lt;br /&gt;
&lt;br /&gt;
=== chomp ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;chomp&amp;lt;/tt&amp;gt; supprime tous les caractères de fin de ligne d&#039;une chaîne de caractères et renvoie le nombre de caractères supprimés. &amp;lt;br /&amp;gt;Exemple : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;$nb_car = chomp($chaine);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Contrairement à &amp;lt;tt&amp;gt;chop&amp;lt;/tt&amp;gt; qui enlève seulement le dernier caractère de fin de ligne. &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Exemple d&#039;un script Perl ==&lt;br /&gt;
&lt;br /&gt;
Le [perl_script.pl script] va se lire lui-même et sortir à l&#039;écran son contenu modifié : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#!/usr/bin/perl -W&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;# Fichier script.pl&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;use&#039;&#039;&#039; strict &#039;&#039;&#039;qw&#039;&#039;&#039;(subs vars refs);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&#039;&#039;&#039;my &#039;&#039;&#039;$file = &amp;quot;$0&amp;quot;;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&#039;&#039;&#039;open&#039;&#039;&#039;(FILE, &amp;quot;&amp;lt;$file&amp;quot;);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#Lecture du fichier ligne par ligne jusqu&#039;à la fin du fichier.&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&#039;&#039;&#039;while&#039;&#039;&#039; (&amp;lt;FILE&amp;gt;) {&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  #Remplace tous les mots &#039;file&#039; par &#039;fichier&#039;.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  $_ &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;s&#039;&#039;&#039;/file/fichier/&#039;&#039;&#039;ig&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  #Transforme les lettres minuscules de &#039;a&#039; à &#039;e&#039; en majuscules.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  $_ &#039;&#039;&#039;=~&#039;&#039;&#039; &#039;&#039;&#039;tr&#039;&#039;&#039;/a-e/A-E/;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  #Affiche le résultat des transformations à l&#039;écran.&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;  &#039;&#039;&#039;print&#039;&#039;&#039; $_;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;}&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&#039;&#039;&#039;close&#039;&#039;&#039;(FILE);&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;#Fin script.pl&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt;&amp;lt;br /&amp;gt;Ce script est totalement inutile mais je crois que cela montre la facilité d&#039;utilisation. &amp;lt;br /&amp;gt;Oui, j&#039;en conviens, en shell cela tiens en une ligne : &amp;lt;tt&amp;gt;&#039;&#039;&#039;cat&#039;&#039;&#039; script.pl | &#039;&#039;&#039;sed&#039;&#039;&#039; -e &#039;s/file/fichier/ig&#039; | &#039;&#039;&#039;sed&#039;&#039;&#039; y/a-e/A-E/&amp;lt;/tt&amp;gt;. Bizarre, cela ressemble au Perl !? ;-)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Obtenir de l&#039;aide ou en savoir plus ==&lt;br /&gt;
&lt;br /&gt;
=== Sur notre machine ===&lt;br /&gt;
&lt;br /&gt;
Et oui ! Sur notre propre machine il y a plein de sources de documentation sans même le savoir. &amp;lt;br /&amp;gt;La première qui viens à l&#039;esprit &#039;&#039;naturellement&#039;&#039; c&#039;est LE &amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt;. &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;man perl&amp;lt;/tt&amp;gt; vous donne quelques généralités, ainsi que la liste de toutes les sections du manuel de perl (&amp;lt;tt&amp;gt;perlsyn&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;perlre&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;perlvar&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;perlop&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;perlfun&amp;lt;/tt&amp;gt;...).&lt;br /&gt;
&lt;br /&gt;
Ensuite, il y a le &amp;lt;tt&amp;gt;man&amp;lt;/tt&amp;gt; propre à Perl, qui est &amp;lt;tt&amp;gt;perldoc&amp;lt;/tt&amp;gt;. Le meilleur moyen de voir comment cela marche, c&#039;est d&#039;essayer : &amp;lt;br /&amp;gt;&amp;lt;tt&amp;gt;perldoc perldoc&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bon, l&#039;inconvénient, c&#039;est que tout ceci est en anglais...&lt;br /&gt;
&lt;br /&gt;
=== Sur Internet ===&lt;br /&gt;
&lt;br /&gt;
Sur Internet, nous trouverons plein de sites parlant de Perl. En général, ils parlent des scripts CGI (scripts Perl pour serveur web). Mais néanmoins, il y a&lt;br /&gt;
&lt;br /&gt;
* le [http://www.perl.com site officiel], bien sûr.&lt;br /&gt;
* les groupes (français et anglais) marchent bien : &lt;br /&gt;
** [http://groups.google.com/groups?hl=en&amp;amp;group=fr.comp.lang.perl fr.comp.lang.perl]&lt;br /&gt;
** [http://groups.google.com/groups?hl=en&amp;amp;group=comp.lang.perl comp.lang.perl]&lt;br /&gt;
* les sites des &#039;&#039;mongueurs&#039;&#039; Perl, suivez mon regard ! ;-) &lt;br /&gt;
** &amp;lt;u&amp;gt;Note de Jice&amp;lt;/u&amp;gt; : je me dois de citer les deux sites suivants, vu que le regard de Jonesy est sur moi ;)&lt;br /&gt;
** les [http://paris.mongueurs.net Paris Perl Mongueurs],&lt;br /&gt;
** et les [http://www.mongueurs.net Mongueurs de Perl] qui fédèrent les groupes locaux (Paris, Lyon, Toulouse...).&lt;br /&gt;
* la [http://perl.enstimac.fr/ traduction] de la documentation en français.&lt;br /&gt;
* une [http://perl.developpez.com/faq/ faq] sur developpez.com, visiter aussi le [http://www.developpez.net/forums/viewforum.php?f=83 forum] .&lt;br /&gt;
* et enfin, l&#039;intarissable source, [http://www.google.com Google] ! ;-)&lt;br /&gt;
&lt;br /&gt;
Sinon, si on a les moyens les livres O&#039;Reilly sur Perl sont très bien écrits et sont la référence en la matière. &amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Le mot de la fin ==&lt;br /&gt;
&lt;br /&gt;
Surtout n&#039;hésitez pas à m&#039;envoyer vos remarques, vos corrections et vos idées, merci.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;merci&amp;quot;&amp;gt;Cette page est issue de la documentation &#039;pré-wiki&#039; de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Jonesy, Jice le 03/04/2002.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Copyright =&lt;br /&gt;
Copyright &amp;amp;copy; 03/04/2002, Jonesy, Jice&lt;br /&gt;
{{CC-BY-NC-SA}}&lt;/div&gt;</summary>
		<author><name>Rv</name></author>
	</entry>
</feed>