perl使用shift命令

时间:2016-05-02 11:07:54

标签: perl

我有一个关于解析命令行参数和在Perl中使用shift命令的问题。

我想用这一行来启动我的Perl脚本

/home/scripts/test.pl -a --test1 -b /path/to/file/file.txt

所以我想解析命令行参数。这是我编写脚本的一部分

if ($arg eq "-a") {
    $main::john = shift(@arguments);
} elsif ($arg eq "-b") {
    $main::doe = shift(@arguments);
}

我想在$command变量中使用这些参数,这些变量将在之后执行

my $var1=$john;
my $var2=$doe;
my $command = "/path/to/tool/tool --in $line --out $outputdir $var1 $var2";
&execute($command);

现在我遇到两个问题:

指定-a& -b在命令行。但现在发生的是,当我没有指定-a时,我得到的信息是我在定义变量的行中使用了未初始化的值

第二个问题:$var2现在将等于$doe,因此在这种情况下/path/to/file/file.txt。不过,我希望$var2等于--text /path/to/file/file.txt。我应该在哪里指定--text。它不能在$command中标准化,因为当我没有指定-b时它会产生问题。我应该在定义$doe时这样做,但是如何呢?

2 个答案:

答案 0 :(得分:4)

您应该根据变量

的内容构建命令字符串

喜欢这个

my $var1 = $john;
my $var2 = $doe;
my $command = "/path/to/tool/tool --in $line --out $outputdir";

$command .= " $var1"        if defined $var1;
$command .= " --text $var2" if defined $var2;

execute($command);

另外

  • 调用Perl子例程时,请勿使用&符号&。这已经是十八年来不太好的做法

  • 请勿使用$main:xxx等包变量。词汇变量(用my声明)几乎都是必要的

  • 作为Alnitak says in the comment,你应该真正使用Getopt::Long模块来避免在命令行解析中引入错误

答案 1 :(得分:0)

GetOpt :: Long可能是一个选项:http://search.cpan.org/~jv/Getopt-Long-2.48/lib/Getopt/Long.pm

关于你的样本:

您没有说明如果-a-b丢失会发生什么,但默认设置可能会解决您的问题:

# Use 'join' as default if $var1 is not set
my $var1 = $john // 'john';
# Use an empty value as default if $var2 is not set
my $var2 = $doe // '';

关于--text前缀:

你想一直设置吗?

my $command = "/path/to/tool/tool --in $line --out $outputdir $var1 --text $var2";

或者,如果设置了-b = $var2,是否要进行设置?

# Prefix
my $var2 = "--text $john";

# Prefix with default
my $var2 = defined $john ? "--text $john" : '';
# Same, but long format
my $var2 = ''; # Set default
if ($john) {
    $var2 = "--text $john";
}