什么';在Perl脚本中处理命令行参数的正确方法是什么?
我正在尝试创建一个脚本/应用程序,它在运行时接受命令行参数。当然,这是一个日常的事情,但鉴于这是我第一次这样做,我正在寻找一些指导。假设我的脚本可以接受以下类型的命令行参数:什么';在Perl脚本中处理命令行参数的正确方法是什么?,perl,parsing,scripting,command-line-arguments,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.... 由于命令行脚本的灵活性,您可以传递给它的参数可能有多种顺
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
)和测试所有可能出现的参数来解决
但必须有更好的办法。这是难以置信的效率低下(对我来说),我想知道是否有更好的方式做事情。我希望保持尽可能的灵活性,让事情顺利进行,而不是只关注严格的用法。我用它作为论点
未经测试的示例:
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个字符的选项,请使用
Getopt::Std
,如果要支持更长的参数名,请使用Getopt::Long
。可以自动将命令行解析为散列变量。命令行上的顺序无关紧要。您可以通过检查散列键来检查是否提供了选项
use warnings;
use strict;
use Getopt::Long;
my %opts;
GetOptions(\%opts, qw(a p=s l=s m=s)) or die;
只要始终使用
Getopt::Long
-它可以同时处理这两个问题。是的,但是Getopt::Std
使捆绑更加简单,例如将-abc
视为-a-b-c
(代价是根本不处理长选项)。就我个人而言,我不使用捆绑,多年来我也没有使用过Getopt::Std
。对于血淋淋的细节,perldoc Getopt::Long
并阅读“Bundling”部分(有几个配置选项)。您还可以传递GetOptions
哈希引用,它将所有信息存储到哈希中。例如,给定的GetOptions(\%opt,“path=s”,“log=s”)
传递-path/tmp
将为您提供$opt{path}==“/tmp”
。我发现让命令行选项中的信息在代码中很容易看到很方便。