Écosystème et outils¶
L'écosystème outillage de Perl a considérablement évolue ces dernières années. Le Language Server Protocol (LSP) via Perl Navigator apporte une expérience moderne dans VS Code, tandis que Perl::Critic et perltidy assurent la qualité du code. Devel::NYTProf reste la référence pour le profiling, et perlbrew ou plenv permettent de gérer plusieurs versions de Perl en parallèle.
Éditeurs et IDEs¶
VS Code avec Perl Navigator¶
VS Code est l'éditeur recommande pour Perl en 2025 grâce à l'extension Perl Navigator qui implémenté un serveur LSP complet.
# Installation de Perl Navigator (serveur LSP)
cpanm PerlNavigator # Non, Perl Navigator est une extension VS Code
# Dependances necessaires pour les fonctionnalites completes
cpanm Perl::Critic
cpanm Perl::Tidy
cpanm PLS # Perl Language Server alternatif
Extensions VS Code recommandees :
| Extension | ID | Rôle |
|---|---|---|
| Perl Navigator | bscan.perlnavigator | LSP : autocompletion, goto def, rename |
| Perl | richterger.perl | Syntaxe highlighting basique |
| GitLens | eamodio.gitlens | Historique git |
| Even Better TOML | tamasfe.even-better-toml | Edition de cpanfile et dist.ini |
// .vscode/settings.json — configuration recommandee pour Perl
{
"perlnavigator.perlPath": "/usr/bin/perl",
"perlnavigator.enableWarnings": true,
"perlnavigator.perltidyEnabled": true,
"perlnavigator.perlcriticEnabled": true,
"perlnavigator.perlcriticSeverity": 3,
"editor.formatOnSave": true,
"[perl]": {
"editor.defaultFormatter": "bscan.perlnavigator",
"editor.tabSize": 4
}
}
Vim et Neovim¶
" ~/.vimrc ou ~/.config/nvim/init.vim
" Installation via vim-plug
call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'} " LSP client
Plug 'vim-perl/vim-perl' " Syntaxe Perl
call plug#end()
" Configuration coc-nvim pour Perl Navigator
" Dans coc-settings.json :
" {
" "languageserver": {
" "perlnavigator": {
" "command": "perlnavigator",
" "filetypes": ["perl"]
" }
" }
" }
Padre (IDE Perl natif)¶
Padre est un IDE écrit en Perl avec Wx. Bien que moins actif que VS Code, il reste utile pour les environnements sans internet ou avec des contraintes d'installation.
Choix en 2025
VS Code + Perl Navigator est la combinaison recommandee pour tout nouveau projet. Padre convient aux environnements contraints. Vim/Neovim avec LSP est préféré par les développeurs habitues a ces éditeurs.
Linters et formateurs¶
Perl::Critic¶
Perl::Critic est le linter statique de référence. Il applique les politiques issues du livre Perl Best Practices de Damian Conway, organisees en niveaux de sévérité de 1 (brutal) a 5 (gentle).
# Installation
cpanm Perl::Critic
# Analyse avec severite par defaut (5 = gentle)
perlcritic lib/MonApp/Service.pm
# Niveau strict (1 = brutal, tres strict)
perlcritic --severity 1 lib/
# Niveau recommande pour un projet (3 = harsh)
perlcritic --severity 3 lib/
# Rapport verbeux
perlcritic --verbose 8 lib/MonApp/Service.pm
# Themes specifiques
perlcritic --theme 'pbp || security' lib/
# .perlcriticrc — configuration du projet
severity = 3
theme = pbp
# Desactiver des politiques specifiques
[-CodeLayout::RequireTidyCode] # On gere perltidy separement
[-Documentation::RequirePodSections] # Trop strict pour des scripts
# Configurer une politique
[Variables::ProhibitPunctuationVars]
allow = $_ $! $@ $/ $\
[RegularExpressions::RequireExtendedFormatting]
minimum_regex_length_to_complain_about = 30
Politiques importantes par catégorie :
| Catégorie | Politique | Description |
|---|---|---|
| Variables | ProhibitUnusedVariables | Signale les variables declarees mais inutilisees |
| Subroutines | RequireArgUnpacking | Impose my ($self, $arg) = @_ |
| Modules | RequireUseStrict, RequireUseWarnings | Pragmas obligatoires |
| RegularExpressions | ProhibitComplexRegexes | Limite la complexité des regex |
| ErrorHandling | RequireCarping | Préférer carp/croak a warn/die |
| InputOutput | ProhibitBarewordFileHandles | Interdire les filehandles globaux |
| CodeLayout | RequireTidyCode | Code doit passer perltidy sans diff |
perltidy¶
# Installation
cpanm Perl::Tidy
# Application sur un fichier (cree .bak)
perltidy lib/MonApp/Service.pm
# Application sans fichier backup
perltidy -b lib/MonApp/Service.pm
# Verification uniquement (exit code 1 si changements necessaires)
perltidy --check-syntax lib/MonApp/Service.pm
# Recursif sur tout le code source
find lib/ -name '*.pm' -exec perltidy -b {} \;
perlimports¶
# Installation
cpanm App::perlimports
# Verifie et nettoie les imports inutilises
perlimports --lint lib/MonApp/Service.pm
# Mode correction automatique
perlimports lib/MonApp/Service.pm
Analyse statique¶
B::Lint¶
# B::Lint est dans le core Perl
perl -MO=Lint,all mon_script.pl
# Verifications disponibles
perl -MO=Lint,context,implicit-read,implicit-write mon_script.pl
Perl::Critic avec politiques de sécurité¶
# Politiques de securite disponibles
cpanm Perl::Critic::Policy::Security::ProhibitSystemWithShellExpansion
cpanm Perl::Critic::Bangs
# Analyse centree securite
perlcritic --theme security --severity 1 lib/
#!/usr/bin/perl
use v5.36;
# Probleme detecte par Perl::Critic : system() avec interpolation shell
my $fichier = $ARGV[0];
# MAUVAIS : injection shell possible
system("rm $fichier"); # Perl::Critic signale cette ligne
# BON : liste d'arguments, pas d'interpolation shell
system('rm', $fichier); # Securise
# MAUVAIS : open() avec mode en deux arguments
open(FH, ">$fichier"); # Vulnerability d'injection
# BON : open() avec mode en trois arguments
open(my $fh, '>', $fichier) or die "Impossible d'ouvrir : $!";
Debuggers¶
perl -d — debugger intégré¶
# Lancement du debugger interactif
perl -d mon_script.pl
# Commandes principales dans le debugger
# h Aide
# n Next (pas par-dessus)
# s Step (pas dans)
# r Return (sortir de la fonction courante)
# c Continue (jusqu'au prochain breakpoint)
# b 42 Breakpoint a la ligne 42
# b calcul Breakpoint dans la sous-routine 'calcul'
# p $var Afficher la valeur de $var
# x $ref Afficher une structure de donnees (format Data::Dumper)
# l Lister les lignes autour du curseur
# q Quitter
Devel::Trepan — debugger avance¶
# Installation
cpanm Devel::Trepan
# Lancement
trepan.pl mon_script.pl
# Commandes supplementaires par rapport a perl -d
# disassemble <sub> Desassemble une sous-routine
# info locals Variables locales
# set trace Trace l'execution
Debugger VS Code¶
// .vscode/launch.json — configuration du debugger Perl pour VS Code
{
"version": "0.2.0",
"configurations": [
{
"type": "perl",
"request": "launch",
"name": "Lancer le script",
"program": "${workspaceFolder}/app.pl",
"args": ["daemon", "-l", "http://*:3000"],
"env": {
"MOJO_MODE": "development"
},
"stopOnEntry": false
},
{
"type": "perl",
"request": "launch",
"name": "Tests",
"program": "${workspaceFolder}/t/api.t",
"stopOnEntry": false
}
]
}
Profileurs¶
Devel::NYTProf¶
NYTProf est le profileur de référence pour Perl. Il fournit des rapports HTML détaillés au niveau de la ligne et de la sous-routine.
# Installation
cpanm Devel::NYTProf
# Profilage
perl -d:NYTProf mon_script.pl
# Generation du rapport HTML
nytprofhtml --open # Ouvre automatiquement dans le navigateur
# Rapport CSV pour integration CI
nytprofcsv --file=nytprof.out
#!/usr/bin/perl
# Instrumentation manuelle de sections specifiques
use v5.36;
use Devel::NYTProf::API;
# Desactiver le profiling pour certaines sections
DB::disable_profile();
mon_code_sans_profiling();
DB::enable_profile();
# Section critique a profiler
ma_fonction_lente();
Interpréter NYTProf
Dans le rapport HTML, la vue "Subroutine" classe les fonctions par temps exclusif (temps passe dans la fonction elle-même, sans les appels). La vue "File" montre le temps par ligne. Commencez par identifier les 3-5 fonctions avec le plus de temps exclusif.
Devel::Size — mémoire¶
#!/usr/bin/perl
# Mesure de la taille memoire des structures de donnees
use v5.36;
use Devel::Size qw(size total_size);
my @gros_tableau = (1..10_000);
my %gros_hash = map { $_ => "valeur_$_" } 1..1_000;
printf "Taille tableau : %d octets\n", size(\@gros_tableau);
printf "Total tableau : %d octets\n", total_size(\@gros_tableau);
printf "Taille hash : %d octets\n", size(\%gros_hash);
printf "Total hash : %d octets\n", total_size(\%gros_hash);
Gestionnaires de version Perl¶
perlbrew¶
perlbrew installe et géré plusieurs versions de Perl dans ~/perl5/perlbrew/, independamment du Perl système.
# Installation de perlbrew
\curl -L https://install.perlbrew.pl | bash
# Ajout au shell
echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bashrc
source ~/.bashrc
# Lister les versions disponibles
perlbrew available
# Installer une version
perlbrew install perl-5.40.0
perlbrew install perl-5.38.2 --noman # Sans les pages de manuel (plus rapide)
# Lister les versions installees
perlbrew list
# Utiliser une version
perlbrew use perl-5.40.0 # Temporaire (session courante)
perlbrew switch perl-5.40.0 # Permanent (par defaut)
# Installer cpanm pour la version active
perlbrew install-cpanm
# Creer un environnement local (lib)
perlbrew lib create mon-projet
perlbrew use perl-5.40.0@mon-projet
plenv¶
plenv est inspire de rbenv (Ruby) et pyenv. Il géré les versions de Perl via des shims dans le PATH.
# Installation
git clone https://github.com/tokuhirom/plenv.git ~/.plenv
git clone https://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build
# Ajout au shell
echo 'export PATH="$HOME/.plenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(plenv init -)"' >> ~/.bashrc
source ~/.bashrc
# Installer une version
plenv install 5.40.0
# Lister les versions installes
plenv versions
# Version globale
plenv global 5.40.0
# Version locale au projet (cree .perl-version)
plenv local 5.38.2
# Installer cpanm
plenv install-cpanm
Comparatif perlbrew vs plenv¶
| Critère | perlbrew | plenv |
|---|---|---|
| Inspiration | Original Perl | rbenv/pyenv |
| Fichier de version | Commande switch uniquement | .perl-version dans le répertoire |
| Isolation | Bonne (lib per-version) | Bonne (shims) |
| Rapidité | Correcte | Très rapide (shims légers) |
| Écosystème | Très mature, large communauté | Mature, bien maintenu |
| Recommandation | Projets Perl exclusifs | Polyglotte (avec rbenv, pyenv, etc.) |
perlbrew en CI
Pour les pipelines CI/CD, preferez shogo82148/actions-setup-perl (GitHub Actions) ou perlbrew script d'installation rapide plutôt qu'une installation manuelle. Ces outils gèrent le cache des installations Perl entre les runs.
Résumé de l'outillage recommande¶
| Besoin | Outil recommande | Alternative |
|---|---|---|
| Éditeur | VS Code + Perl Navigator | Vim/Neovim + LSP |
| Formateur | perltidy | — |
| Linter | Perl::Critic (severity 3) | — |
| Tests | Test2::V0 + prove | Test::More + prove |
| Tests d'intégration web | Test::Mojo | — |
| Mocking | Test::MockModule | Test::Mock::Simple |
| Couverture | Devel::Cover | — |
| Profiling | Devel::NYTProf | Devel::SmallProf |
| Mémoire | Devel::Size | — |
| Debugger | VS Code Perl debugger | perl -d, Devel::Trepan |
| Version manager | perlbrew | plenv |
| Deps manager | Carton + cpanm | cpanm seul |