我正在尝试创建一个在运行时接受命令行参数的脚本/应用程序。当然,这是一个日常的事情,但看到这是我第一次这样做,我正在寻找一些指导。假设我的脚本可以采用这些命令行参数:
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
使用有效的电子邮件)并测试所有可能的事件。
但必须有更好的方法。这对我来说是非常低效的,我想知道是否有更好的做事方式。我希望尽可能保持灵活性,让事情发挥作用,而不是专注于严格使用。
答案 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;