Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[FAQ] fr.comp.lang.perl

1 réponse
Avatar
Samuel Mouniee
==== La documentation sur Perl ====


== Où trouver de la documentation sur Perl ? ==

La documentation de Perl est fournie avec perl, au format POD.
Elle est accessible en ligne de commande (shell ou boite dos) via
perldoc <nom rubrique>. La documentation est découpée par grands
thèmes, comme la sécurité (perldoc perlsec) , les fonctions du
langage Perl (perldoc perlfunc), etc ... Un bon début est perldoc
perl.

Vous pouvez effectuer une recherche sur l'ensemble des FAQ,
utilisez l'option -q. Exemple, recherchez CGI dans la FAQ :
perldoc -q CGI. Voici la liste des thèmes :

* perlfaq1 - Questions d'ordre général sur Perl
* perlfaq2 - Trouver et apprendre Perl
* perlfaq3 - Outils de programmation
* perlfaq4 - Manipulation de données
* perlfaq5 - Fichiers et formats
* perlfaq6 - Expressions rationnelles
* perlfaq7 - Problèmes du langage Perl
* perlfaq8 - Interaction avec le système
* perlfaq9 - Réseau

Pour obtenir la documentation d'une fonction Perl, utilisez
l'option -f. Par exemple, le détail de la fonction stat s'obtient
avec perlfaq -f stat.

Voir question suivant pour la version française et une description
plus détaillée des différents thèmes. Exceptée perldoc, il existe
également de nombreuses documentations sur Perl. Google peut vous
aider à les retrouver.


== Existe-t-il une traduction de la documentation Perl ? ==

Oui ! Cependant, certaines parties ne sont pas encore traduites.
Voir <http://www.enstimac.fr/Perl/>.


== Quelques bons livres sur Perl ? ==

* "Introduction à Perl" de Randal L. Schwartz, O'Reilly
International ISBN 2-84177-005-2
* "Programmation en Perl" (3ème édition) de Larry Wall, Tom
Christiansen et Jon Orwant, O'Reilly International ISBN
2-84177-140-7
* "Perl en action" de Tom Christiansen & S.Blondeel O'Reilly
International ISBN 2-84177-077-X

Voir <http://www.editions-oreilly.fr/perl.html>


==== Comment trouver de l'aide et debugger un script Perl ? ====


== Comment debugger un script Perl ? ==

Utilisez ce pragma pour commencer vos scripts:

#!/usr/bin/perl -w
use diagnostics;
use strict;

* -w: Affiche divers avertissements optionnels (équivalent de use
warnings; sous perl-5.8)
* use diagnostics: Rend les messages de -w plus explicites.
* use strict: Génère certains messages d'erreur sur des variables
non sûres, réfèrences ou fonctions. Voir la portée des variables.

Il existe le module Devel::ptkdb qui permet d'avoir un debugger
graphique en Perl/TK.


== Comment trouver de l'aide en Perl ? ==

* Lire les FAQ disponibles distribuées avec Perl. Voir les liens
de la première question pour la version française.
* Faire une recherche dans les news sur les articles postés sur le
sujet. En effet, les articles de news sont archivés et indexés
comme les pages HTML. Il est donc facile de savoir si quelqu'un a
déjà eu un problème similaire. Un des meilleurs moteurs pour les
news est Google.
* Si aucun des 2 premiers points n'a répondu à vos question, les
news <news://fr.comp.lang.perl> et
<news://fr.comp.infosystemes.www.auteurs> vous attendent.
* Vous pouvez aussi utiliser IRC. Utilisez un client IRC (ex:
Xchat ou Trillian). Allez :

IRCNET le canal #perlfr sur le serveur
<irc://irc.fr.ircnet.net/>
FREENODE le canal #perlfr sur le serveur
<irc://irc.eu.freenode.net/>


== Pourquoi/Quand ne pas envoyer de questions concernant les CGI sur
fclp ? ==

Le forum fr.comp.lang.perl est dédié à Perl. Donc, inutile de
poster dans ce forum si votre problème concerne la configuration
du serveur (<news://fr.comp.infosystemes.www.serveurs/>), PHP
(<news://fr.comp.infosystemes.www.auteurs.php/>), ou le
fonctionnement général des CGI
(<news://fr.comp.infosystemes.www.auteurs>).

Ce n'est pas non plus un forum où demander de A jusqu'à Z ce que
vous voulez faire. Si vous vous sentez juste au niveau technique,
l'embauche de salarié(s) ou de programmeur(s) indépendant(s) peut
être à prévoir ... Par contre, si votre problème porte sur une
instruction Perl dans une application quelle qu'elle soit, vous
êtes sur le bon forum.


==== CPAN ====


== Existe-t-il une version de Perl pour ... ? ==

Voir <ftp://ftp.perl.com/CPAN/ports> ou
<ftp://ftp.lip6.fr/pub/perl/CPAN/ports>


== Que sont les modules de Perl ? ==

Il s'agit de bibliothèques supplémentaires développées un peu
partout dans le monde et répondant à des besoins très variés. Les
modules sont tous regroupés sur les sites du CPAN. Certains
finissent par être incorporés dans les distributions de Perl. (Ex
: CGI).

L'extension d'un module est .pm, on l'utilise avec la directive
use.

Les modules sont classés soit par thèmes, soit par auteur, soit
par nom de module. Pensez-bien avant de développer quelque chose à
visiter les catégories similaires à votre projet.

la base de données des miroirs du CPAN est disponible sur le site
<http://mirror.cpan.org/>.

Voici deux sites contenant un miroir du CPAN :

* Hébergement américain : <ftp://ftp.perl.com/CPAN/modules/>
* Hébergement français :
<ftp://ftp.lip6.fr/pub/perl/CPAN/modules/>


== Existe-t-il un module/script qui fait ... ? ==

Il existe un moteur de recherche sur la liste des modules:
<http://search.cpan.org/>.


== Comment installer un module Perl ? ==

* Sous Unix (méthode manuelle)
% tar zxvf monmodule.tar.gz
% cd monmodule
% perl Makefile.PL
% make
passer en root
# make install

* Sous Unix (via le module CPAN)
sous le compte root
# perl -MCPAN -e shell
# > install mon::module

* Sous Windows : (ActiveState) Utilisez ppm:
C:\>ppm
PPM interactive shell (1.1.1)
- type 'help' for available commands.

PPM> search DBI
Packages available from http://www.activestate.com/Packages
DBI [1.13.1] Database independent interface for Perl
FindBin [1.04 ] Locate directory of original perl script

PPM> install DBI
Install package 'DBI?' (y/N): y
Retrieving package 'DBI'...
Writing D:\perlNT\site\lib\auto\DBI\.packlist
PPM>

* Sous Windows (Indigo Perl): Il faut utiliser l'interface Web
GPM http://www.indigostar.com/indigoperl.htm


== Existe-t-il une version de Perl pour Windows ? ==

Il y a :

ActiveState
<http://www.ActiveState.com/ActivePerl/download.htm>

IndigoPerl ( Perl+Apache+PHP )
<http://www.indigostar.com/indigoperl.htm>


== Existe-t-il un environnement de développement pour Perl ? ==

Les scripts Perl sont des fichiers textes, il n'existe pas
d'environnement de développement à proprement parler. Un vi ou un
wordpad peut suffire.

Maintenant pour le confort, il y a :

GNU/Emacs
<http://www.gnu.org/software/emacs/emacs.html>

XEmacs
<http://www.xemacs.org/>

Komodo
<http://www.activestate.com/Products/Komodo/>

OpenPerl IDE
<http://open-perl-ide.sourceforge.net/>

SCiTE
<http://www.scintilla.org/SciTE.html>

: VIM <http://www.vim.org/>

Nedit
<http://www.nedit.org/>

Et d'autres ...


==== perldoc perlfunc ====


== Comment récupérer des paramètres en ligne de commande ? ==

Les paramètres passés en ligne de commande sont stockés dans le
tableau @ARGV.

Voir perldoc perlvar . Voir aussi Getopt::Long et Getopt::Std pour
des options de la forme -h ou --help .


== Comment utiliser un ensemble de fonctions Perl comme une
bibliothèque ? ==

Il faut mettre l'ensemble des fonctions dans un fichier texte, et
rajouter 1; en bas de fichier. Pour utiliser la bibliothèque,
faire "require monfichier.pl";

Exemple :

# fichier meslib.pl
sub affiche_toto {print "toto\n";}
sub affiche_tata {print "tata\n";}
1;
# fin de meslib.pl

#!/usr/bin/perl -Tw
# Executable
use strict;
require "/mon/home/meslib.pl";
af
iche_toto();
affiche_tata();

Voir perldoc -f require


== Comment trier un tableau ? ==

Perlfaq4, Comment trier un tableau par ...


== Comment récupérer la date du jour ? ==

Cf perldoc -f localtime

( $seconde, $minute, $heure, $jour, $mois, $annee,
$jour_de_la_semaine, $jour_de_l _annee, $drapeau_heure_ete )
= localtime( time() );

Il faut ajouter 1900 a l'année pour une date correcte
($annee+=1900) et 1 au mois pour obtenir une date correcte
($mois++).


== Comment récupérer des informations sur un fichier ? ==

Cf perldoc -f stat. Par exemple pour récupérer mtime (date de
dernière modification du fichier)

my( $fchier )= "/tmp/toto";
# Si le fichier existe on récupère des infos dessus
my @etat = stat( $fchier )
or die "stat( $fichier ) failed: $!";
# On convertit avec localtime la valeur de mtime.
my $date = localtime( $etat[9] );
print $date;


== Comment copier un fichier ? ==

use File::Copy;

copy( $src, $dest )
or die "impossible de copier $src vers $dest : $!";


== Comment connaître le contenu d'un répertoire ? ==

Cf perldoc -f opendir,readdir,closedir. Par exemple, lire tous les
fichiers de $rep sauf ceux dont le nom commence par "." :

opendir(DIR, $rep) or die "Erreur en ouvrant $rep : $!";
my @liste = readdir(DIR) or die "Erreur en lisant $rep : $!";
my @liste = grep { !/^\./ } @liste;
closedir(DIR) or die "Erreur en fermant $rep : $!";


==== Réseau ====


== Comment faire un client FTP ? ==

En utilisant le module Net::FTP

use Net::FTP;

my $ftp = Net::FTP->new("some.host.name");
$ftp->login("anonymous","mon@adresse.mail");
$ftp->cwd("/pub");
$ftp->get("/ce/repertoire/ce.fichier");
$ftp->quit;


== Comment faire un client TELNET ? ==

En utilisant le module Net::Telnet

use strict;
use Net::Telnet;
use CGI qw/:standard :html3 :netscape escape unescape/;
use CGI::Carp qw/fatalsToBrowser/;

my $username="alian";
my $passwd="password";
my $HOST="indy.alianet";
print header;
my $t = new Net::Telnet (Timeout=>undef) or die "Can't connect: $!";
$t->open($HOST);
$t->login($username, $passwd);
my @lines = $t->cmd("/ma/commande/a/executer");
print join(' ',@lines);


== Comment faire un client HTTP ? ==

En utilisant le module LWP

use LWP::UserAgent;
$ua = new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);

# Creation d'une requete
my $req = new HTTP::Request ( 'POST',
'http://www.perl.com/cgi-bin/BugGlimpse' );
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');

# On passe la requête à l'agent et on attend le résultat
my $res = $ua->request($req);

# Si le résultat est un succès (code HTTP 200) on affiche son contenu
if ($res->is_success) {print $res->content;}

# Sinon on prévient que URL est defectueuse
else {print "Cette URL ne répond pas\n";}


==== Annexes ====


== Les toolkits graphiques ==

Il existe différents toolkits graphiques en perl. il y a :

Perl/TK
Perl/TK est le toolkit historique en Perl. Il est disponible
sur quasiment toutes les plate-formes.

Perl/GTK et Glade
Perl/GTK est basé sur GTK le noyau de The Gimp et de Gnome.
<http://www.gtkperl.org/>

Glade est un RAD pour faire des interfaces GTK en XML.

Perl/QT
QT est le toolkit de KDE édité par TrollTech.

WxPerl
WxWindows est un toolkit pour plusieurs plate-formes.
<http://wxperl.sourceforge.net/>

Prima
Prima est un toolkit pour plusieurs plate-formes avec un RAD
pour faire les interfaces. <http://www.prima.eu.org/>


== Comment lancer une commande système ? ==

* `ls`;
* system('ls');
* exec('ls');
* open( PROG, "ls|" );
* Les modules IPC::Open2 et IPC::Open3 permettent de faire
communiquer deux programmes via STDIN, STDOUT et STDERR (pour
IPC::Open3).

En sachant que toutes n'agissent pas de la même manière. Voir
perlfaq8


== Comment savoir laquelle de mes deux commandes est la plus optimisée
? ==

En sachant que ce module produit beaucoup de bruits et ne permet
de découvrir que des choses évidentes...

#!/usr/local/bin/perl -w

use Benchmark;

my $code1 = sub { for ( $i=0 ; $i<100 ; $i++ ) { } };
my $code2 = sub { $i=0; while ( $i<100 ) { ++$i } };
my $code3 = sub { for ( 0..99 ) { } };

my $t1 = timeit( 1000000, $code1 );
my $t2 = timeit( 1000000, $code2 );
my $t3 = timeit( 1000000, $code3 );

print "Code 1 -> ", timestr( $t1 ), "\n";
print "Code 2 -> ", timestr( $t2 ), "\n";
print "Code 3 -> ", timestr( $t3 ), "\n";


== Comment distribuer des programmes Perl sans Perl ? ==

Utilisez pp (Perl Packager) qui est distribué avec le module PAR
(Perl ARchive). On peut l'installer

* sous Unix avec le module CPAN (sous le compte root)
# perl -MCPAN -e shell
# cpan> install PAR

* sous Windows, avec ppm :
> ppm install PAR

Ensuite la commande

pp monscript.pl

produit un (gros) fichier ex\x{00E9}cutable a.out (Unix) ou a.exe
(Windows). Voir les nombreuses options dans la doc de pp.

Il y a aussi deux programmes (non gratuits) :

* Perl2Exe chez IndigoSTAR
<http://www.indigostar.com/perl2exe.htm>
* PerlApp dans le Perl Dev Kit d'ActiveState
<http://www.activestate.com/Products/Perl_Dev_Kit/>


== Quel est la portée des variables en Perl ? ==

Par défaut, Perl voit toutes les variables qui n'ont pas été
déclarées comme locales comme des variables globales. A partir du
moment où une variable a été initialisée et non déclarée, sa
valeur sera conservée quel que soit le bloc. Déclarer une variable
comme locale au bloc/fonction se fait à l'aide des opérateurs my
et local, chacun ayant ses spécificités.

Une variable, telle que $scal, @arr, ou %hash est une entrée dans
la table de symboles du module courant.

Dans un bloc, déclarer : local $scal; a pour effet d'empiler une
nouvelle valeur pour la variable $scal, qui reste globale. Cette
valeur sera dépilée à la sortie du bloc.

Par contraste avec : my $scal; qui déclare une variable scopée
statiquement, qui ne correspond pas à une entrée dans la table des
symboles, et est donc juste visible dans le bloc courant, ou le
fichier courant si déclarée à l'exterieur d'un bloc. A la façon
d'une variable automatique en C. Perl gère les fermetures (un peu
comme Lisp), ce qui signifie qu'une variable my $scal peut être
accedée même lorsque le bloc dans lequel elle a été déclarée a été
fermé.

Par exemple:

{
my $x = 3;
sub inc_x { $x += 1; }
sub print_x {print "\$x = $x\n";}
}
print_x();
inc_x();
print_x();

Renvoie: 3 4

Il est encore plus conseillé de ne pas garder ce comportement par
défaut en utilisant le module strict. Lorsque vous mettez "use
strict;" au début de votre script, vous vous obligez à déclarer
toutes vos variables. Une variable globale se définit alors à
l'aide du pragma : use vars qw( $mes $noms %de @variables ); A
noter que quand le nombre de variables globales est grand, ce
n'est pas très pratique ni très lisible. A partir de la version
5.6.0 de perl (et même des toutes dernières versions 5.5_...), le
mot clé 'our' peut être utilisé pour déclarer une variable
globale.

Il existe un document très bien fait s'appelant "Coping with
scoping" disponible à l'adresse
<http://www.enstimac.fr/Perl/ModulesFr/Les_espaces_de_nom.html>.


==== Divers ====


== Contributeurs ==

les contributeurs de cette FAQ sont :

Alain Barbet - auteur initial
Samuel Mouniée - auteur
Benoit Izac - auteur
Jean-Louis Morel - auteur
Ronan Le Hy - relecteur
Alex Marandon - relecteur
Emmanuel Florac - relecteur
Paul Gaborit - relecteur
Olivier (Rue des Prairies) - relecteur

1 réponse

Avatar
Alex Marandon
In article <br1mmr$2tls$, Samuel Mouniee wrote:
Le forum fr.comp.lang.perl est dédié à Perl. Donc, inutile de
poster dans ce forum si votre problème concerne la configuration
du serveur (<news://fr.comp.infosystemes.www.serveurs/>), PHP
(<news://fr.comp.infosystemes.www.auteurs.php/>), ou le


Apparemment fciwap a été remplacé par fr.comp.lang.php.