perl可选命令行参数
我是Perl新手,希望了解以下逻辑在Perl中是否有效:- 我必须使用带有一些参数的Perl脚本执行一个命令,我需要做好准备 参数列表中,某些参数也是可选的(可能存在也可能不存在) 在上述参数中,我有必需的参数[0],控制器和成员是可选的。我的疑问是,如果“controller”参数不存在,我是否需要输入“null” 在那里,或者默认情况下,Perl将处理它 编辑:- 为了澄清这个问题,我没有“controller”参数,但是有“member”参数 谢谢perl可选命令行参数,perl,command-line,perl-module,perl-data-structures,Perl,Command Line,Perl Module,Perl Data Structures,我是Perl新手,希望了解以下逻辑在Perl中是否有效:- 我必须使用带有一些参数的Perl脚本执行一个命令,我需要做好准备 参数列表中,某些参数也是可选的(可能存在也可能不存在) 在上述参数中,我有必需的参数[0],控制器和成员是可选的。我的疑问是,如果“controller”参数不存在,我是否需要输入“null” 在那里,或者默认情况下,Perl将处理它 编辑:- 为了澄清这个问题,我没有“controller”参数,但是有“member”参数 谢谢 -arbit子例程的参数以数组形式传递。
-arbit子例程的参数以数组形式传递。看起来您已经意识到,当您在
@args
中建立参数时
如果您的子例程只需要一个参数列表,那么您的方法存在一些问题
首先,正如您所意识到的,如果将空数组推到数组上,您将不会在@args
数组中添加任何项目。这会把你的子程序弄糊涂。使用Data::Dumper测试这一点非常简单
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my @arguments = ('Arg1');
my @controller;
my @member;
my @args;
push(@args, $arguments[0]);
push(@args, @controller);
push(@args, @member);
say Dumper \@args;
输出如下所示:
$ ./args
$VAR1 = [
'Arg1'
];
但你也有相反的问题。如果@controller
或@member
包含多个元素,则参数数组中的元素太多,会弄乱
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my @arguments = ('Arg1');
my @controller = ('C1', 'C2');
my @member = ('M1', 'M2');
my @args;
push(@args, $arguments[0]);
push(@args, @controller);
push(@args, @member);
say Dumper \@args;
其中:
$ ./args2
$VAR1 = [
'Arg1',
'C1',
'C2',
'M1',
'M2'
];
$ ./args3
$VAR1 = [
'Arg1',
undef,
undef
];
$ ./args4
$VAR1 = [
'Arg1',
'C1',
'M1'
];
这两个问题的解决方案是相同的。如果您希望从@controller
和@member
中只获得一个元素,请询问一个元素。如果数量太少,则会在数组中得到一个undef
,如果数量太多,则会得到第一个
空数组:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my @arguments = ('Arg1');
my @controller;
my @member;
my @args;
push(@args, $arguments[0]);
push(@args, $controller[0]);
push(@args, $member[0]);
say Dumper \@args;
其中:
$ ./args2
$VAR1 = [
'Arg1',
'C1',
'C2',
'M1',
'M2'
];
$ ./args3
$VAR1 = [
'Arg1',
undef,
undef
];
$ ./args4
$VAR1 = [
'Arg1',
'C1',
'M1'
];
满阵列:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;
my @arguments = ('Arg1');
my @controller = ('C1', 'C2');
my @member = ('M1', 'M2');
my @args;
push(@args, $arguments[0]);
push(@args, $controller[0]);
push(@args, $member[0]);
say Dumper \@args;
其中:
$ ./args2
$VAR1 = [
'Arg1',
'C1',
'C2',
'M1',
'M2'
];
$ ./args3
$VAR1 = [
'Arg1',
undef,
undef
];
$ ./args4
$VAR1 = [
'Arg1',
'C1',
'M1'
];
这有帮助吗?为什么
@controller
和@member
是数组
是否可以传入多个控制器(如果存在)?或者,您是否认为push
的两个参数都必须是数组
第二个参数可以是标量值。推送前测试:
push(@args, $arguments[0]);
push(@args, $controller) if defined $controller;
push(@args, $member) if defined $member;
这将推入空白/空字符串,但如果参数未定义,则不会。如果这些值为空、null或零值时不需要这些值,可以执行以下操作:
push(@args, $arguments[0]);
push(@args, $controller) if $controller;
push(@args, $member) if defined $member;
并且,您可以使用join
将参数重新连接回单个字符串:
my $full_command = join " ", $command, @args;
my $errors = system qw($full_command);
或者,如果执行时不需要shell:
my $errors = system $command, @args;
这将在没有shell的情况下执行命令。使用散列作为唯一参数不是更容易吗?e、 g.
%hash={agr0=>$arguments[0],ctrl=>@controller,mem=>@member}
@yoanncoble您的代码被破坏了-可以使用%hash=(…)
或者$hash\u ref={…}
@Xaerxess Ooops,对了,对不起。+1:演示OP如何自己测试和找出答案。