我是Perl的新手,希望知道以下逻辑是否适用于Perl: -
我必须使用带有一些参数的Perl脚本执行命令,我需要准备它 参数列表,一些参数也是可选的(可能存在也可能不存在)
push(@args, $arguments[0]);
push(@args, @controller);
push(@args, @member);
在上述参数中,我有必需的参数[0],控制器和成员是可选的。我的疑问是万一“控制器”参数不存在我需要把“null” 在那里或默认情况下Perl会照顾它吗?
编辑: - 为了澄清这个问题,我没有“控制器”参数但是有“成员”参数。
由于 -Arpit
答案 0 :(得分:1)
子例程的参数在数组中传递。看起来你已经意识到,正如你在@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'
];
这两个问题的解决方案是相同的。如果您只需要@controller
和@member
中的一个元素,那么请求exaclty一个元素。如果太少,那么你会在数组中得到一个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;
给出了:
$ ./args3
$VAR1 = [
'Arg1',
undef,
undef
];
Overfull数组:
#!/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;
给出了:
$ ./args4
$VAR1 = [
'Arg1',
'C1',
'M1'
];
这有帮助吗?
答案 1 :(得分:0)
为什么@controller
和@member
数组?
你能传递多个控制器(如果有的话)吗?或者,您认为push
的两个参数都必须是数组吗?
第二个参数可以是标量值。推前测试:
push(@args, $arguments[0]);
push(@args, $controller) if defined $controller;
push(@args, $member) if defined $member;
这将推送空/空字符串,但如果参数未定义则不会。如果您不希望这些值,如果这些值为空或零或零值,则可以执行以下操作:
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的命令。