La réponse que vous avez déjà accepté semble assez compliqué. C'est possible avec seulement quelques changements à votre code existant.
sub go
{
# I need to use arguments here
# print foo
# print bar
print "In go\nArgs are: @_\n";
}
my %functions = (
go => \&go
);
my $function = shift;
if (exists $functions{$function}) {
# Pass remaining command-line args to the called subroutine
$functions{$function}->(@ARGV);
} else {
die "There is no function called $function available\n";
}
J'ai mis un appel print()
à go()
(donc je sais qu'il est appelé) et je l'ai passé @ARGV
à la sous-routine trouvée dans le tableau de répartition.
Vous pouvez simplement l'appeler comme n'importe quel autre programme Perl.
$ perl program.pm go foo=bar bar=fubar
In go
Args are: foo=bar bar=fubar
$ perl program.pm XX foo bar
There is no function called XX available
Mise à jour: Dans un commentaire, cette exigence a été ajouté:
Mais comment je fais diviser les valeurs dans un hachage?
Il y a deux réponses à cela. Et celui que vous choisissez dépend de ce que vous essayez réellement de faire.
Si vous voulez juste prendre une « foo = bar » chaîne et analyser dans une paire de clés/valeur stockée dans un hachage, vous pouvez remplacer le sous-programme go()
avec le code comme ceci:
use Data::Dumper;
sub go
{
# I need to use arguments here
# print foo
# print bar
my %args = map { split /=/ } @_;
print "In go\nArgs are: " . Dumper(\%args) . "\n";
}
vous obtenez alors cette sortie:
$ perl program.pm go foo=bar bar=fubar
In go
Args are: $VAR1 = {
'bar' => 'fubar',
'foo' => 'bar'
};
Si vous essayez réellement d'analyser les options de ligne de commande, vous devez utiliser un analyseur d'option de ligne de commande comme GetOpt::Long.
use Data::Dumper;
use Getopt::Long 'GetOptionsFromArray';
sub go
{
# I need to use arguments here
# print foo
# print bar
my %args;
GetOptionsFromArray(\@_, \%args, 'foo=s', 'bar=s');
print "In go\nArgs are: " . Dumper(\%args) . "\n";
}
Notez que pour que cela fonctionne, vous devrez passer des options appropriées de style Unix qui commencent par --
.
$ perl program.pm go --foo=bar --bar=fubar
In go
Args are: $VAR1 = {
'bar' => 'fubar',
'foo' => 'bar'
};
Mais cette version est beaucoup plus souple dans ses exigences d'entrée:
$ perl program.pm go --f bar --b fubar
In go
Args are: $VAR1 = {
'bar' => 'fubar',
'foo' => 'bar'
};
Et il vous dira si vous utilisez des noms d'options non valides.
$ perl program.pm go --fu=bar --baz=fubar
Unknown option: fu
Unknown option: baz
In go
Args are: $VAR1 = {};
double possible de [Comment puis-je analyser les arguments de ligne de commande?] (Https://stackoverflow.com/questions/3972955/how-can-i-parse-command-line-arguments) –