【问题标题】:@ARGV in Perl (command line arguments) [duplicate]Perl中的@ARGV(命令行参数)[重复]
【发布时间】:2014-10-22 16:18:19
【问题描述】:

(请在标记问题之前先阅读它!我知道有人问过类似的问题,但形式不同且不完整)。

我试图找到处理命令行参数或脚本选项的自然和正常方式。假设脚本可以采用任何可能类型的参数或选项。例如:

./myscript.pl runabnormal --help /sbin/proc -f filename CONFIG=set.config LOG=me.log

到目前为止,我知道的最好方法是使用Dumper,如下所示:

use strict;
use warnings;
use Data::Dumper qw(Dumper);

print Dumper \@ARGV;

输出:

$VAR1 = [
      'runabnormal',
      '--help',
      '/sbin/proc',
      '-f',
      'filename',
      'CONFIG=set.config',
      'LOG=me.log'
    ];

对此有何一般性建议? perl 程序员通常如何处理脚本输入的复杂参数?

【问题讨论】:

  • 你说你的问题很特别,与其他问题不同,但在我看来,你问的只是如何使用@ARGV?使用Data::Dumper 几乎不是“最佳”方式,因为它只打印参数的值。

标签: perl command-line arguments argument-passing argv


【解决方案1】:

使用Getopt::Long:

use strict;
use warnings;

use Getopt::Long;

GetOptions(
    "log=s"    => \( my $log ),                  # string
    "file=s"   => \( my $file = "file.dat" ),    # string with default
    "help"     => \( my $help ),                 # boolean
    "config=s" => \( my $config ),               # string
) or die "Error in command line arguments";

# Pulls in: ("runabnormal", "/sbin/proc")
my ($state, $proc) = @ARGV;

关于命令行args常见做法的两个注意事项:

  1. 选项通常是小写的。所以将CONFIG=set.config 更改为config=set.config
  2. 带有参数的选项以两个破折号为前缀。 --log=me.log

因此以下方法可行:

./myscript.pl runabnormal --help /sbin/proc -f filename --config=set.config --log=me.log

【讨论】:

  • 这实际上需要--config=set.config --log=me.log,但无论如何这更传统,而且肯定更好,除非那些X=Y 参数是任意的。 // my ($state, $proc) = @ARGV; 是什么?
  • 好眼光。错过了。已更新答案。
  • @ARGV 用于他的示例中包含的两个非选项。决定不再考虑破译他的意图,只是啜食它们。
  • 我不知道如何处理-f filenamefile=s 处理 -f 吗?如果我有-f1 file1 -f2 file2怎么办?
  • -f1-f2 在这种情况下将是单独的选项,需要代码来定义它们。但是,可以将多个值传递给同一个选项:Getopt::Long - Options with multiple values
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2013-06-13
  • 2020-11-15
  • 2019-09-16
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多