你已經接受了答案似乎相當複雜。只需對現有代碼進行一些更改即可。
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";
}
我已經把print()
呼叫go()
(所以我知道它被稱爲)和我通過@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
更新:在評論中加入這樣的要求:
但我怎麼值分成散列?
有兩個答案。你選擇哪一個取決於你實際想要做什麼。
如果你只是想採取任何「富=酒吧」字符串,並將其解析爲存儲在哈希鍵/值對,那麼你可以用這樣的代碼替換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 = {};
[如何可以解析的命令行參數?](https://stackoverflow.com/questions/3972955/how-can-i-parse-command-line-arguments) –