Perl中的@ARGV(命令行参数)

时间:2014-08-28 17:46:04

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

(请在标记问题之前先阅读!我知道类似的问题已被提出,但形式不同且不完整)。

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

./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程序员通常如何处理输入到脚本的复杂参数?

1 个答案:

答案 0 :(得分:2)

使用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
  3. 因此以下方法可行:

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