Question

J'ai une chaîne avec des arguments possibles en ligne de commande (à l'aide d'un programme Read-Eval-Print-Loop) et je souhaite qu'elle soit analysée de manière similaire aux arguments en ligne de commande lorsqu'elle est transmise à Getopt :: Long.

Pour élaborer:

j'ai une chaîne

$str = '--infile /tmp/infile_location --outfile /tmp/outfile'

Je souhaite qu'il soit analysé par GetOptions afin de faciliter l'ajout de nouvelles options.

Une solution à laquelle je pourrais penser est de scinder la chaîne sur des espaces, de remplacer @ARGV par un nouveau tableau, puis d’appeler GetOptions. quelque chose comme ...

my @arg_arr = split (/\s/, $input_line);

# This is done so that GetOptions reads these new arguments
@ARGV = @arg_arr;
print "ARGV is : @ARGV\n";
GetOptions (
            'infile=s'  => \$infile,
            'outfile=s' => \$outfile
           );

Existe-t-il une bonne / meilleure solution?

Était-ce utile?

La solution

Consultez la section analyse des options de une chaîne arbitraire dans la page de manuel de Getopt :: Long , I pense qu'il fait exactement ce que vous cherchez.

Autres conseils

Au lieu de séparer les espaces, utilisez la fonction glob intégrée. En plus de séparer les espaces, cela fera les extensions standard de la ligne de commande, puis retournera une liste. (Par exemple * donnerait une liste de fichiers, etc.) Je recommanderais également local-izing @ARG sur le principe général.

En dehors de cela, c'est le seul moyen de le faire sans réécrire GetOptions. (Il est clair que je dois lire la documentation plus attentivement.)

Wow !!!

Je pense pouvoir utiliser à la fois les réponses de Bentilly et Dinomite et procéder comme suit:

  • utilise glob pour effectuer des développements standard en ligne de commande
  • transmettez le tableau après glob à la méthode GetOptionsFromArray de GetOpt :: Long (voir ici )

Le code peut ressembler à quelque chose comme ...

GetOptionsFromArray ([glob ($input_line)]);

Et ce n’est qu’une ligne .. cool (je sais que je dois faire une erreur de vérification, etc.) mais c'est cool ...

Lorsque vous utilisez Getopt :: Long avec autre chose que la saisie de l'utilisateur, sachez que certaines fonctionnalités sont différentes en fonction de la variable d'environnement POSIXLY_CORRECT. Vous pouvez le remplacer par l'appel approprié à Configurer.

anecdote obligatoire POSIXLY_CORRECT .

Il semble que les méthodes GetOptionsFromArray et GetOptionsFromString aient été ajoutées uniquement dans la v2.36 et, comme Murphy dirait, je n'ai que la version 2.35.

Pour le moment, je pense que je devrai vivre avec le @ARGV local.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top