perl可选命令行参数

时间:2013-06-05 09:02:15

标签: perl command-line perl-module perl-data-structures

我是Perl的新手,希望知道以下逻辑是否适用于Perl: -

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

push(@args, $arguments[0]);
push(@args, @controller);
push(@args, @member);

在上述参数中,我有必需的参数[0],控制器和成员是可选的。我的疑问是万一“控制器”参数不存在我需要把“null” 在那里或默认情况下Perl会照顾它吗?

编辑: - 为了澄清这个问题,我没有“控制器”参数但是有“成员”参数。

由于 -Arpit

2 个答案:

答案 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的命令。