Historique de la question :
Dans les premières versions de Perl, la variable @ARGV fournissait une liste des arguments de la ligne de commande. Cependant, le parsing manuel était sujet à des erreurs. Pour améliorer la lisibilité et la flexibilité, le module Getopt::Std est apparu, suivi plus tard par Getopt::Long et des modules externes CPAN (par exemple, MooX::Options, Getopt::Euclid).
Problème :
Le parsing « manuel » ne prend souvent pas en compte les nombres négatifs, les drapeaux obligatoires et multiples, les paramètres avec des espaces. Différents formats de syntaxe (--flag=value, -abc, positions mixtes) peuvent rendre le script peu convivial et facilement cassable lors de changements d'ordre des arguments.
Solution :
Utiliser Getopt::Long pour un parsing avancé des options et des drapeaux. Il prend en charge les options longues/courtes, la détection automatique des variantes, les tableaux, les hachages et différents formats de drapeaux. Pour des interfaces CLI très complexes, des modules CPAN avec une description déclarative des paramètres sont utilisés (MooX::Options, MooseX::Getopt).
Exemple de code :
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose est $verbose Count est $count Files: @files ";
Caractéristiques clés :
Comment distinguer les arguments positionnels des optionnels si seul Getopt::Std est utilisé ?
Getopt::Std ne peut pas gérer les options nommées longues ni séparer automatiquement les arguments positionnels. Après le parsing des drapeaux courts, les positionnels sont accessibles dans @ARGV, mais le support de la syntaxe complexe nécessite un travail manuel.
Quelle est la principale différence entre Getopt::Long et Getopt::Std ?
Getopt::Std ne fonctionne qu'avec des options courtes (à un seul caractère), tandis que Getopt::Long peut parser des drapeaux longs, des types de valeurs, des tableaux/hachages et prend en charge des clés non alphabétiques.
Peut-on accepter des paramètres via STDIN, et pas seulement via @ARGV ?
Oui, mais ce n'est pas standard pour Getopt::Long. Pour des entrées mixtes CLI et STDIN, vous devez lire STDIN manuellement et intégrer cette entrée dans votre logique de parsing.
Un script parse manuellement chaque argument de @ARGV dans une boucle, en oubliant les valeurs après --arg, le fonctionnement avec -- et le traitement erroné des nombres négatifs (par exemple, -5 devient un drapeau).
Avantages :
Inconvénients :
Utilisation de Getopt::Long avec une brève description de toutes les variables au début du fichier. Les tableaux, l'obligation, la vérification de format et l'affichage de l'aide sont pris en charge.
Avantages :
Inconvénients :