Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Perl脚本中处理命令行参数的正确方法是什么?_Perl_Parsing_Scripting_Command Line Arguments - Fatal编程技术网

什么';在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”
。我发现让命令行选项中的信息在代码中很容易看到很方便。