您已经接受的答案似乎相当复杂。只需对现有代码进行几处更改,就可以做到这一点。
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";
}
我已经在go() 中调用了print()(所以我知道它正在被调用),并且我已经将@ARGV 传递给了调度表中的子例程。
您可以像任何其他 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
更新:在评论中,添加了此要求:
但是如何将值拆分为哈希?
对此有两个答案。而你选择哪一个取决于你实际想要做什么。
如果您只想获取任何“foo=bar”字符串并将其解析为存储在哈希中的键/值对,则可以将go() 子例程替换为如下代码:
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";
}
然后你会得到这个输出:
$ perl program.pm go foo=bar bar=fubar
In go
Args are: $VAR1 = {
'bar' => 'fubar',
'foo' => 'bar'
};
如果您实际上是在尝试解析命令行选项,那么您应该使用像 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";
}
请注意,要使其正常工作,您需要传递以 -- 开头的正确 Unix 样式选项。
$ perl program.pm go --foo=bar --bar=fubar
In go
Args are: $VAR1 = {
'bar' => 'fubar',
'foo' => 'bar'
};
但这个版本的输入要求要灵活得多:
$ perl program.pm go --f bar --b fubar
In go
Args are: $VAR1 = {
'bar' => 'fubar',
'foo' => 'bar'
};
它会告诉你是否使用了无效的选项名称。
$ perl program.pm go --fu=bar --baz=fubar
Unknown option: fu
Unknown option: baz
In go
Args are: $VAR1 = {};