0

我是 Perl 新手,想知道以下逻辑在 Perl 中是否有效:-

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

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

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

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

谢谢-Arpit

4

2 回答 2

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'
        ];

这两个问题的解决方案是相同的。如果您只需要 and 中的一个元素,则要求精确一个@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;

这使:

$ ./args3
$VAR1 = [
          'Arg1',
          undef,
          undef
        ];

过满的数组:

#!/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'
        ];

这有帮助吗?

于 2013-06-05T10:55:27.183 回答
0

为什么是@controller@member数组?

你能传入多个控制器(如果有的话)吗?或者,您是否认为 to 的两个参数都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 的情况下执行您的命令。

于 2013-06-05T13:55:18.280 回答