Alianwebserver.com

Source for Perl : wwww.perl.com Sommaire

FAQ fr.comp.lang.perl

La documentation sur Perl

Comment trouver de l'aide

Perl et le CPAN

perldoc perlfunc

Réseau

Annexes

Voir aussi la FAQ CGI

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 :

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 ?

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

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 :

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 :
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');
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 = '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 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 version 5.5_...), le mot clé 'our' peut être utilisé pour déclarer une variable globale.