【问题标题】:perl parse command line arguments using shift commandperl 使用 shift 命令解析命令行参数
【发布时间】:2016-05-02 11:07:54
【问题描述】:

我有一个关于解析命令行参数和在 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 时我应该这样做,但是如何呢?

【问题讨论】:

  • perldoc GetOpt::Long

标签: perl


【解决方案1】:

你应该根据变量的内容来构建你的命令字符串

像这样

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 模块以避免在命令行解析中引入错误

【讨论】:

    【解决方案2】:

    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";
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 2021-11-03
      • 2021-11-05
      • 2013-03-21
      相关资源
      最近更新 更多