P ART
Perl-Fu
INTRODUCTION A PERL
COURS DE GROBGELD POUR PERL-FU
C H A P T E R
Introduction à Perl
Ce chapitre est une brève introduction à Perl pour les utilisateurs qui ne sont pas familiarisés avec lui, ou qui ne sont pas des programmeurs expérimentés. Nous ne pouvons pas vous apprendre comment programmer en Perl, mais nous allons essayer de vous montrer quelques applications et possibilités de Perl.
Perl-Fu ne fait pas partie du Cur de la distribution Gimp 1.0.x. Par contre Perl-Fu sera comprise en standard dans la prochaine version de Gimp (1.2). Inutile de râler parce que vous utilisez la version Gimp 1.0.x. Perlon est disponible comme greffon pour Gimp 1.0.x, et Perlon est aussi compris dans le développement de la prochaine version de Gimp.
Perlon est un greffon (plug-in) qui permet décrire des scripts Gimp en Perl, exactement comme le greffon Script-Fu permet décrire des scripts Gimp basés sur Schème.
Oui, Perl-Fu et Script-Fu sont tous deux des greffons (plug-ins).
A notre avis, Perle est considérablement plus direct et simple à utiliser que Schème. De plus, il y a beaucoup plus de scripts Perl disponibles (et de programmeurs expérimentés) que de scripts basés sur Schème. Notez que nous ne parlons pas des scripts spécifiquement Gimp, mais des scripts en général.
Perl est aussi le principal langage utilise pour les scripts CGI. Si vous êtes un peu familiarisés avec les scripts UNIX shell, vous apprendrez très facilement Perl. En fait, vous trouverez probablement moins compliqué décrire des scripts Perl que des scripts shell. Tous les awk, sed et autres pincements?? (tweaks) utilisés couramment dans les scripts shell peuvent être réalisés dans Perl sans laide dautres programmes shell UNIX.
Dans Un cours pour les utilisateurs de Perl Gimp pages 735 et suivantes, vous trouverez le cours Perl-Fu Dov Grob-gelbs. Il est très bon, et si vous êtes familiarisés avec Perl, vous serez probablement capables dutiliser directement Perl-Fu. Cependant ce cours na pour objet de former à Perl, ce qui serait un programme trop important et au-delà de lobjectif de ce manuel; il ne vous donnera quun cours sommaire sur Perl.
QUEL DOIT ÊTRE VOTRE NIVEAU DEXPERIENCE?
Pour ceux qui débutent complètement, ce cours sommaire facilitera la lecture et la compréhension du cours de Dov. Après la lecture de ce cours sommaire, vous pourrez décider dutiliser ou non Perl-Fu. Pour en apprendre plus à ce sujet, le meilleur conseil que nous puissions vous donner est dacheter un livre sur Perl et dapprendre les bases de la programmation en Perl. Si vous êtes familiarises avec le script shell, par exemple, vous serez probablement capable (avec un peu daide de la documentation en ligne sur Perl) de commencer à utiliser Perl-Fu après la lecture du cours sommaire et du cours de Dov.
Les Perl-Fu man pages traitent de toutes les commandes du greffon Perl-Fu, et se trouvent dans lappendice Perl-Fu Man Pages pages 835 et suivantes. Ces pages sont une excellente source dinformation pour lécriture de scripts Perl-Fu.
Soyons clair: Il vous faudra comprendre Perl pour utiliser Perl-Fu, mais Perl est un langage très étendu, et vous naurez pas besoin de tout en apprendre. Il est souvent suffisant dapprendre les bases de Perl-Fu pour lécriture de scripts Gimp. Quand vous aurez plus dexpérience, vous pourrez en apprendre plus sur lécriture des scripts Perl. Dans ce chapitre, nous traitons de linstallation et de la configuration du greffon Perl-Fu. La procédure est en général simple, mais si Perl nest pas installé dans votre système, elle peut présenter quelques difficultés.
INSTALLATION AND CONFIGURATION DE PERL-FU
Si vous avez lu les chapitres précédents sur linstallation de divers accessoires dans Gimp, (voir Drawing Tablets And Gimp pages 657 et suivantes, et Scanning And Scanners pages 219 et suivantes), vous vous attendez probablement à trouver au moins 10 pages sur linstallation de Perl-Fu.
Eh bien nous ne ferons pas ainsi cette fois. Si vous avez poursuivi la lecture jusquà ce point, vous devez pouvoir effectuer cette installation avec seulement quelques indications. On trouve aussi beaucoup de conseils sur la compilation dans Compiler les greffons pages 769 et suivantes.
Il est toujours bon dutiliser le code source le plus récent pour le greffon Perl-Fu et pour lextension Gtk Perl dont Perl-Fu a besoin. Consultez Perl-Fu page 881 pour connaître à partir doù télécharger Perl-Fu et le module Perl Gtk.
Assurez-vous dabord que vos bibliothèques Gimp et Gtk sont dans votre chemin de recherche de bibliothèques (your library search path). Dans linux ceci est déterminé par le fichier /etc/ld.so.conf. Solaris (et la plupart des autres dialectes Unix) utilisent ma variable denvironnement LD_LIBRARY_PATH pour déterminer le chemin de recherche des bibliothèques (library search path).
Ensuite, vos répertoires binaires de Gimp et Gtk doivent être sur votre chemin (déterminé par la variable denvironnement PATH). Les programmes de configuration (configure) utilisés pour préparer les modules Perl-Fus et Gtks Perl sont dépendants de loutil trouver Gimp (finding gimp-tool) et de gtk-config.
Si vous avez plusieurs installations de Gimp et/ou de Gtk, il est très important de régler PATH et LD_LIBRARY_PATH pour que la recherche commence par les bons répertoires.
Supposez que vous ayez Gimp 1.0.x et Gtk 1.0.x installés sous /opt/gimp et
Gimp 1.1.x et GA 1.2.x installés sous /opt/gimp1.1, et que vous vouliez mettre en service Perl-Fu dans Gimp 1.1.x.
Vous devez alors régler le PATH ainsi:
PATH=/opt/gimp1.1/bin:$PATH
Et votre LD_LIBRARY_PATH ainsi:
LD_LIBRARY_PATH=/opt/gimp1.1/
lib:$LD_LIBRARY_PATH.
Cette procédure vous assurera que la compilation et linstallation de Perl-Fu et du module Perl Gtk seront effectués pour une utilisation dans Gimp 1.1.x.
Si vous ne réglez pas correctement votre environnement, il est pratiquement certain que vous narriverez pas à compiler et à installer Perl-Fu. Naturellement, il faudra aussi que Perl soit installé dans votre système. Soit Perl 5.004_04, soit Perl 5.005 ou une version plus récente.
Notre dernier conseil est de lire les fichiers README et INSTALL fournis avec Perl-Fu et le module Perl Gtk. Si vous pensez pouvoir vous en dispenser, soit vous souffrez dun cas sévère de grosse tête (hubris), ou (ce qui est moins probable) vous êtes vraiment un expert dUNIX, de Gimp et de leur configuration, compilation, installation, etc.
Nous ne pouvons ici traiter de toutes les fonctions de base de Perl, mais nous allons essayer den voir lessentiel, dont vous aurez besoin pour suivre le cours de Dov.
Cette section est destinée aux débutants absolus, et ne vous attendez donc pas à comprendre dautres scripts Perl après avoir lu ce cours sommaire et le cours de Dov.
DEFINIR UN SCRIPT PERL
Normalement quand on exécute un programme le fichier programme est un fichier binaire formé de uns et de zéros. Pourtant un fichier de programme Perl est différent car Perl est un langage interprété (interpreting language). Perl utilise des fichiers textes ordinaires que les humains peuvent lire et non un fichier binaire composé de 0 et de 1.
Il est donc nécessaire dindiquer au système dexploitation quil devra utiliser linterpréteur de Perl (cest à dire exécuter le fichier avec laide de Perl) quand le système dexploitation lance le fichier. Ceci sobtient en chmod:ant le fichier
chmod 755 perl_fu_script.pl
et avec une instruction spéciale en haut du fichier Perl:
#!/usr/local/bin/perl
Cette instruction spéciale signale au système dexploitation quil devra utiliser Perl pour exécuter le fichier. (Naturellement lemplacement de Perl est spécifique à linstallation, dans ce cas cétait /usr/bin/perl.)
Vous avez probablement entendu parler de scripts shell. Les scripts Shell utilisent comme Perl des fichiers quon peut lire. Une première instruction dun script shell est:
#!/bin/sh
(or #!/bin/bash la plupart du temps dans un système Linux).
Comme on peut le voir, il existe plusieurs types de langages de scripts, et la première instruction du fichier texte indique quel est linterpréteur à utiliser. Le reste du fichier contient le code du script.
Le commutateur (switch) -w qui vient après #!/usr/local/bin/perl ordonne à Perl de vous alerter sil y a des erreurs potentielles dans votre script. Nous recommandons fortement lutilisation de la balise -w dans les scripts Perl.
Linstallation Cur?? (core) de Perl contient beaucoup de fonctions que le programmeur peut utiliser, et il est aussi possible dinstaller des modules supplémentaires à Perl pour lui ajouter dautres fonctions si besoin est.
Lajout permanent de toutes les fonctions Perl rendra ce programme lent (Cette définition nest pas tout à fait correcte, mais elle suffit ici). Il est préférable de ne charger les fonctions que lorsquon en a besoin.
Par exemple, supposons que vous écriviez une application réseau supposée copier un fichier distant (un fichier présent dans un autre ordinateur) vers votre ordinateur. Il vous faudra peut être la fonctionnalité Net:remotecopy (cette commande est complètement fictive) dans Perl. Cette fonctionnalité nétant pas présente par défaut dans Perl, il faudra en demander le chargement au script. Ce qui est réalisé par la commande use dans Perl:
use Net:remotecopy;
Cette instruction indique à Perl quil faut charger la fonctionnalité remotecopy. Une fois cette fonctionnalité chargée, on peut utiliser toutes les commandes de copie à distance dans un programme Perl. Il en est de même pour un script Perl-Fu (qui nest que le nom dun script Perl utilisant les fonctionnalités Gimp)
use Gimp;
use Gimp::Fu;
Ceci indique à Perl quil faut charger la fonctionnalité Gimp et la fonctionnalité Gimp::Fu.
Mais pourquoi faut-il charger deux modules? Eh bien, la module Gimp apporte la fonctionnalité de base de Gimp à Perl. Le module Gimp::Fu (qui dépend du module Gimp) charge beaucoup de fonctions Gimp qui facilitent lécriture des scripts Perl-Fu.
Les Variables sont de choses qui peuvent stocker des choses. Par exemple, la variable A peut stocker la valeur 10. Dans Perl une variable est définie ainsi:
$variable = 10;
Notez la terminaison ; qui indique à Perl quil a atteint la fin de la commande
(Ceci est valable pour toutes les commandes Perl). On peut aussi écrire:
$variable
=
10
;
Mais ce nest pas aussi élégant, nest-ce pas?
Dans Perl, une fonction est une routine qui effectue des choses pour vous. La plupart du temps, les fonctions sont utilisées pour aider le programmeur de différentes façons.
Au lieu décrire la même chose dans le code de nombreuses fois, le programmeur peut le faire une seule fois dans une fonction. Il appellera cette fonction quand il en aura besoin. Il en résulte que vous naurez pas à entrer toutes les instructions correspondantes, mais aussi que votre code sera plus facile à comprendre.
En fait, quand vous importez un module fonctionnel (comme un module Gimp), vous importez beaucoup de fonctions que vous pourrez utiliser dans votre code, comme la fonction gimp_displays_flush qui empourpre laffichage de Gimp. Pour empourprer laffichage de Gimp, entrez:
gimp_displays_flush();
et laffichage sera empourpré. Ceci est évidemment plus simple que de rentrer le code flush display à chaque utilisation (il vous faudrait aussi savoir mettre en uvre cette fonction; maintenant, il vous suffira de savoir lutiliser).
Pour créer vos propres fonctions, nommées aussi subroutines, vous devez déclarer la fonction par le nom spécial : sub suivi du nom de la fonction que vous voulez réaliser:
sub karins_flush_display {
gimp_displays_flush();
}
Cette fonction na évidemment aucune utilité. Cependant, vous pouvez maintenant utiliser lappel de fonction karins_flush_display(); au lieu de gimp_displays_flush();
.
Un script Perl-Fu possède une ou plusieurs subroutines que vous utilisez pour manipuler ou créer des images Gimp.
Variables et Fonctions
On peut voir souvent dans les scripts Perl-Fu:
sub some_function {
my($variable1, $variable2) = @_;
#The subroutine code
#Hash marks are comment marks in a Perl script
}
Le mot clé my fait des variables ($variable1 and $variable2) des variables locales à lintérieur de la subroutine. Ce qui signifie que vous ne pourrez pas y avoir accès ni aux valeurs quelles contiennent en dehors de la subroutine.
La variable @_ est une variable spéciale contenant les arguments avec lesquels la subroutine a été appelée (En fait, cest un peu plus compliqué mais suffisant ici; et nous ne voulons pas trop compliquer les choses à ce niveau). Supposons que vous ayez ce code:
sub some_function {
my($variable1, $variable2) = @_;
print $variable1 + $variable2;
#(print will simply print the sum \
of $variable1 and $variable2)
}
some_function(1,2);
Ensuite, some_function est appelée avec 1 ou 2 comme arguments. Perl lit le fichier entier et enregistre la subroutine. Ensuite, Perl exécute la première commande qui dans ce cas est some_function(1,2);.
La ligne my($variable1, $variable2) = @_; nous permet dassigner 1 à $variable1, et 2 à $variable2, car elles sont stockées dans la variable spéciale @_ dans cet ordre. La ligne suivante imprime 3, qui est la somme de 1 et 2.
Une particularité des scripts Perl-Fu est \&function_name qui est utilise dans la partie registry de Perl-Fu (ne vous inquiétez pas, Dov traitera de la partie registry de Perl-Fu).
En tous cas, il existe une façon très spéciale dinclure les subroutines devant être appelées dans les scripts Perl. Vous devez utiliser cette sorte de référence quand vous appelez votre première et seule subroutine dans la partie registry de Perl-Fu.
Voulez-vous répéter plusieurs fois la même chose? Vous devrez utiliser la fonctionnalité boucle (loop). Il existe plusieurs façons de le faire dans Perl, mais nous ne présenterons que la boucle for car cest celle qui est utilisée dans le cours de Dov.
Dov utilise une boucle for comme dans cet exemple:
$number_of_loops = 10;
for ($i=0; $i<$number_of_loops; $i++) {
#(The code)
}
Le $i=0; $i<$number_of_loops; $i++ nous indique que la valeur de départ de la boucle est 0 ($i=0) et que chaque fois quune boucle est effectuée nous ajouterons 1 à $i ($i++).
Avant le démarrage de la boucle nous devrons contrôler si $i est inférieur à 10
($i<$number_of_loops). Si cest le cas, nous continuerons à boucler, sinon nous sortirons de la boucle:
$number_of_loops = 10;
for ($i=0; $i<$number_of_loops; ++$i) {
print $i;
}
Ceci est un exemple de boucle simple qui imprime 0123456789 quand on lance le code. Cette ligne montre que nous avons effectué 10 boucles, en partant de 0 et en arrêtant à 9.
Nous navons pas appris beaucoup sur Perl nous avons seulement présenté quelques fonctions de Perl nécessaires à la compréhension du cours de Dov. Si vous êtes intéressés par Perl-Fu, nous vous suggérons dacheter un livre Apprendre Perl.
Un tel livre, avec les exemples de scripts Perl-Fu que vous trouverez dans la distribution de Perl-Fu, et bien entendu les Perl-Fu manpages (que vous trouverez dans lannexe Perl-Fu Man Pages pages 835 et suivantes) sera un très bion moyen daccès à Perl-Fu. Et aussi, noubliez pas de lire lexcellent cours sur Perl-Fu de Dov considérez cela comme impératif