perl可选命令行参数

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子例程的参数以数组形式传递。

我是Perl新手,希望了解以下逻辑在Perl中是否有效:-

我必须使用带有一些参数的Perl脚本执行一个命令,我需要做好准备 参数列表中,某些参数也是可选的(可能存在也可能不存在)

在上述参数中,我有必需的参数[0],控制器和成员是可选的。我的疑问是,如果“controller”参数不存在,我是否需要输入“null” 在那里,或者默认情况下,Perl将处理它

编辑:- 为了澄清这个问题,我没有“controller”参数,但是有“member”参数

谢谢
-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如何自己测试和找出答案。