FAQ fr.comp.lang.perl
La documentation sur Perl
- Où trouver de la documentation sur Perl ?
- Existe-t-il une version de la documentation de perldoc en français ?
- Quelques bons livres sur Perl ?
Comment trouver de l'aide
- Comment debugger un script Perl ?
- Comment trouver de l'aide en Perl ?
- Pourquoi/Quand ne pas envoyer de questions concernant les CGI sur fclp ?
Perl et le CPAN
- Existe-t-il une version de Perl pour ... ?
- Qu'est ce que les modules ou packages de Perl ?
- Existe-t-il un module/script qui fait ... ?
- Comment installer un module Perl ?
- Existe-t-il une version de Perl pour Windows ?
- Existe-t-il un environnement de développement pour Perl ?
perldoc perlfunc
- Comment récupérer les paramètres passés en ligne de commande ?
- Comment utiliser un ensemble de fonctions Perl comme une libraire ?
- Comment trier un tableau ?
- Comment récupérer la date du jour ?
- Comment récupérer des informations sur un fichier ?
- Comment connaitre le contenu d'un répertoire ?
- Comment copier un fichier ?
Réseau
- Comment faire un client HTTP ?
- Comment faire un client FTP ?
- Comment faire un client TELNET ?
- Comment faire un client SSH ?
Annexes
- Comment executer des commandes sytèmes ?
- Comment savoir laquelle de mes deux commandes est la plus optimisée ?
- Comment distribuer des programmes Perl sur Windows sans Perl ?
- Quel est la portée des variables en Perl ?
- Comment gérer des mails via Perl ?
- Où trouver de la documentation sur Perl ?
-
La version html de ce document est disponible ici.
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 generales sur Perl
- perlfaq2: Obtenir et Apprendre Perl.
- perlfaq3: Outils de Programmation.
- perlfaq4: Manipulation de Données.
- perlfaq5 Fichiers et Formats.
- perlfaq6 Expressions Régulières.
- perlfaq7 Questions sur le langage Perl qui ne rentrent dans aucun des chapitres.
- perlfaq8 Interaction avec le système.
- perlfaq9 Programmation réseau.
Pour obtenir la documentation d'une fonction Perl, utilisez l'option -f. Par exemple, le détail de la donction 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. Yahoo peut vous aider à les retrouver.
- Existe-t-il une version de la documentation de perldoc en français ?
- Oui ! Cependant, certaines parties ne sont pas encore traduites. Voir http://www.enstimac.fr/Perl/.
- Quelques bons livres sur Perl ?
-
- "Introduction à Perl" de Randall L. Schartz, O'Reilly International ISBN 2-84177-005-2
- "Programmation en Perl" (3ème édition) de Larry Wall, Randall L. Schartz et Tom Christiansen, O'Reilly International ISBN 2-84177-140-7
- "Perl en action" de Tom Christiansen & S.Blondeel O'Reilly International ISBN 2-84177-077-X
- Comment debugger un script Perl ?
-
Utilisez ce pragma pour commencer vos scripts:
#!/usr/bin/perl -Tw use diagnostics; use strict;
- -w: Affiche divers avertissements optionnels (Equivalent de use warnings; sous perl-5.8)
- -T: Active une sécurité supplémentaire. Le -T effectue les mêmes verifications
sur le script interprété que pour un scripts avec le droit sticky
bit.
Ils vérifient toutes les variables "taint" (souillées) (Initialisée à l'extérieur du programme) Ex : $ENV, STDIN, @ARGV qui pourrait être détournés de leur valeur originale.
Voir perldoc perlsec - use diagnostics: Rend les messages de -w plus explicites.
- use strict: Génere certains messages d'erreur sur des variables non sures, references ou fonctions. Voir la portée des variables
- Comment trouver de l'aide en Perl ?
-
- Lire les FAQ disponibles distribuées avec Perl. Voir liens à de la premiere 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 fr.comp.lang.perl et fr.comp.infosystemes.www.auteurs vous attendent.
- Vous pouvez aussi utiliser irc. Utilisez un client IRC (ex: Epic sous Linux, Trillian sous Win), trouvez un serveur pres de chez vous (http://www.ircnet.com/servers.html) et joignez le channel #perlfr.
- 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 problême de configuration du serveur (fr.comp.infosystemes.www.serveurs), PHP (fr.comp.infosystemes.www.auteurs.php), ou fonctionnement général des CGI (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é ou de free-lance peut-être à prévoir ....Par contre, si votre problême est sur une instruction Perl dans une application quelle qu'elles soient, vous êtes sur le bon forum. :)
- Existe-t-il une version de Perl pour mon système d'exploitation?
-
Voir ftp://ftp.perl.com/CPAN/ports ou ftp://ftp.lip6.fr/pub/perl/CPAN/ports
- Qu'est ce que les modules ou packages de Perl ?
Il s'agit de bibliothèques supplémentaires développées un peu partout dans le monde sur des sujet très variés. Les packages sont tous regroupés sur les sites du CPAN. Certaines finissent par être incorporées dans les distributions de Perl. (Ex : CGI). L'extension d'un package 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 package. Pensez-bien avant de développer quelque chose à visiter les catégories similaires à votre projet. Voici deux sites contenant un mirroir du CPAN :
- Hébergement Américain : ftp://ftp.perl.com/CPAN/modules/
- Hébergement Francais : 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: search.cpan.org
- Comment installer un module Perl ?
- Sous Unix (Ancienne méthode)
% tar zxvf monmodule.tar.gz % cd monmodule % perl Makefile.PL % make # make install
- Sous Unix (Nouvelle méthode)
# 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#GUI Package Manager :
- Sous Unix (Ancienne méthode)
- Existe-t-il une version de Perl pour Windows ?
-
Par exemple, http://www.ActiveState.com/ActivePerl/download.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 dit. Un vi ou un wordpad peut suffire ... Maintenant pour le confort, xemacs sous Unix ou sous Win, l'editeur UltaEdit.
- 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
- Comment utiliser un ensemble de fonctions Perl comme une libraire ?
Il faut mettre l'ensemble des fonctions dans un fichier texte, et rajouter 1; en bas de fichier. Pour utiliser la librairie, 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"; affiche_toto(); affiche_tata();Voir perldoc -f require
- Comment trier un tableau ?
- Cf Perlfaq4, Comment trier un tableau par ...
- Comment faire un client FTP ?
- En utilisant le package 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 package 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 package 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 requete à l'agent et on attend le résultat my $res = $ua->request($req); # Si le resultat est un succes (code HTTP 200) on affiche son contenu if ($res->is_success) {print $res->content;} # Sinon previent que URL defectueuse else {print "Cette URL ne répond pas\n";} - Comment faire un client SSH ?
- En utilisant Net::SSH
use Net::SSH qw(sshopen2); use strict; my $user = "username"; my $host = "hostname"; my $cmd = "command"; sshopen2("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!"; while (<READER>) { chomp(); print "$_\n"; } close(READER); close(WRITER); - Comment récupérer la date du jour ?
- Cf perldoc -f localtime
($seconde,$minute,$heure,$jour_du_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 jour du mois pour obtenir une date correcte ($jour_du_mois++). - Comment récupérer des informations sur un fichier ?
- Cf perldoc -f stat
Exemple pour récupérer mtime (date de dernière modification
du fichier)
my(@etat); my($fchier)="/tmp/toto"; # Si le fichier existe on récupère des infos dessus if (-e $fchier) {@etat=stat($fchier); } # On convertit avec localtime la valeur de mtime. my($date)= localtime($etat[9]); print $date; % Sat Nov 6 01:26:39 1999 - Comment copier un fichier ?
use File::Copy; if (!copy("/chemin/complet/logiciel.db", "/chemin/complet/sauv.db")) {print "Erreur dans la copie:$!\n";}- Comment connaitre 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) || die "Impossible de lire $rep : $!\n"; my @liste = grep { /^[^\.]/ && -r "$rep/$_" } readdir(DIR); closedir(DIR); - Comment lancer une commande système ?
- Cf perlfaq8
- `ls`;
- system('ls');
- exec('ls');
- 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 = 'for ($i=0;$i<100;i++) {print "ligne";}'; my $code2 = '$i=0;while ($i<100) {print "ligne";}'; open (TRASH, ">>/dev/null"); select TRASH; my $t1 = timeit(1000000, $code1); my $t2 = timeit(1000000, $code2); select STDOUT; print "Code 1 a pris ", timestr($t1), "\n"; print "Code 2 a pris ", timestr($t2), "\n"; - Comment distribuer des programmes Perl sans Perl ?
- Vous pouvez utiliser le programme perl2exe, disponible ici : http://www.dynamicstate.com/perl2exe.htm
- Quel est la portée des variables en Perl ?
-
Par défault, 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é quel que soit le bloc. Déclarer une variable comme locale au bloc/fonction se fait à l'aide des "attributs" my et local, chacun ayant ses spécificités.
Une variable, telle que $scal, @arr, ou %hash est une entree dans la table de symboles du package courant.
Dans un bloc, declarer: local $scal; a pour effet d'empiler une nouvelle valeur pour la variable $scal, qui reste globale. Cette valeur sera depilee a la sortie du bloc.
Par contraste avec: my $scal; qui declare un variable scopee statiquement, qui ne correspond pas a une entree dans la table de symboles, et est donc juste visible dans le bloc courant, ou le fichier courant si declaree a l'exterieur d'un bloc. A la facon d'une variable automatique en C. Perl gere les fermetures (un peu comme Lisp), ce qui signifie qu'une variable my $scal peut etre accedee meme apres que le bloc dans lequel elle a ete declaree a ete ferme.
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 4Il 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 version 5.5_...), le mot clé 'our' peut être utilisé pour déclarer une variable globale.