在Perl脚本中处理命令行参数的正确方法是什么?

时间:2011-08-03 17:49:15

标签: perl parsing scripting command-line-arguments

我正在尝试创建一个在运行时接受命令行参数的脚本/应用程序。当然,这是一个日常的事情,但看到这是我第一次这样做,我正在寻找一些指导。假设我的脚本可以采用这些命令行参数:

script -a -p /path/to/pipe -l mail.Error -m root@email.com
script -a -l mail.Error -m root@email.com -p /path/to/pipe

and so on....

由于命令行脚本的灵活性,您可以传递给它的参数可能有多种顺序,可能会丢失/具有无效参数。现在,我知道这可以通过非常严格地说明参数必须如何显示来解决(首先-a,然后-p带路径,然后-l带有日志工具/优先级,最后-m使用有效的电子邮件)并测试所有可能的事件。

但必须有更好的方法。这对我来说是非常低效的,我想知道是否有更好的做事方式。我希望尽可能保持灵活性,让事情发挥作用,而不是专注于严格使用。

3 个答案:

答案 0 :(得分:6)

我使用Getopt::Long作为参数。

未经测试的例子:

use Getopt::Long;
## set defaults
my $path   = '/tmp';
my $log = 'm.Error';
my $email = 'test@email.com';
my $a = 0;
my $result = GetOptions ("path=s"  => \$path,
                         "log=s"   => \$log,
                         "a"       => \$a,
                         "email=s" => \$email);
## both script -a -p /path/to/pipe -l mail.Error -m root@email.com
## and script -a -l mail.Error -m root@email.com -p /path/to/pipe
## should work now

答案 1 :(得分:2)

如果您只想要1个字符的选项,请使用Getopt::Std,如果您想支持更长的参数名称,请使用Getopt::Long

答案 2 :(得分:0)

Getopt::Long可以自动将命令行解析为哈希变量。命令行上的顺序无关紧要。您可以通过检查哈希键来检查是否给出了选项。

use warnings;
use strict;
use Getopt::Long;

my %opts;
GetOptions(\%opts, qw(a p=s l=s m=s)) or die;