gpt4 book ai didi

bash - Perl 将参数从 Bash 传递到文件中

转载 作者:行者123 更新时间:2023-11-29 09:42:21 25 4
gpt4 key购买 nike

我必须在 Perl 文件中运行一个函数,并将参数传递给该函数。

# program.pm

sub go
{
# I need to use arguments here
# print foo
# print bar
}

my %functions = (
go => \&go
);

my $function = shift;

if (exists $functions{$function}) {
$functions{$function}->();
} else {
die "There is no function called $function available\n";
}

这需要通过 bash 运行并传递。我需要能够随机指定参数,如下所示:

$ perl program.pm go foo='bar' bar='fubar'

我对 Perl 很不熟悉。我正在谷歌搜索,但我一生都无法弄清楚如何正确解析这些。似乎有 4 种不同的方法可以做到这一点,但似乎都不适合我的用例。

我也试过了,没用:

$ perl program.pm -e 'go(foo=>"bar")'

最佳答案

您已经接受的答案似乎相当复杂。只需对现有代码进行一些更改即可实现这一点。

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

更新:在评论中添加了此要求:

But how do i split the values into a hash?

这个问题有两个答案。您选择哪一个取决于您实际想要做什么。

如果您只想获取任何“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 = {};

关于bash - Perl 将参数从 Bash 传递到文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com