所以,我已经阅读了一些关于如何使用 Getopt::Long
和类似库来处理 argv
选项的指南,但仍然不知道如何使用它是正确的,因为完全不清楚(对我而言)文档和指南。
我有一个脚本。它有下一个参数:
-qp
,
-pr
,
-rp
,
-vr
,其中大部分用于文件名。
目前我使用的是 Getopt::Long
,但我觉得不合适,因为我每次都需要检查选项后面的内容:
for(my $i = 0; $i < @ARGV; $i+=2){
if ($ARGV[$i] eq "-qp"){
unless ($ARGV[$i+1] eq "-vr" or $ARGV[$i+1] eq "-pr" or $ARGV[$i+1] eq "-rp"){
$query_params = $ARGV[$i+1];
}
}
elsif ($ARGV[$i] eq "-pr"){
unless ($ARGV[$i+1] eq "-qp" or $ARGV[$i+1] eq "-pr" or $ARGV[$i+1] eq "-rp"){
$params = $ARGV[$i+1];
}
}
elsif ($ARGV[$i] eq "-vr"){
unless ($ARGV[$i+1] eq "-vr" or $ARGV[$i+1] eq "-qp" or $ARGV[$i+1] eq "-rp"){
$variables = $ARGV[$i+1];
}
}
elsif ($ARGV[$i] eq "-rp"){
unless ($ARGV[$i+1] eq "-qp" or $ARGV[$i+1] eq "-pr" or $ARGV[$i+1] eq "-vr"){
$replace = $ARGV[$i+1];
}
}
}
也许我不需要为 Unix
使用精确的 Getopt
库,我只需要将一些 args
传递给脚本。有没有办法让它更简单更正确?
最佳答案
与您的声明相反,您没有使用 Getopt::Long。但你应该这样做!
use strict;
use warnings qw( all );
use feature qw( say );
use File::Basename qw( basename );
use Getopt::Long qw( );
my %opts;
sub parse_args {
%opts = ();
Getopt::Long::Configure(qw( posix_default ));
GetOptions(
'help|h|?' => \&help,
'qp:s' => \$opts{qp},
'pr:s' => \$opts{pr},
'rp:s' => \$opts{rp},
'vr:s' => \$opts{vr},
)
or usage();
}
parse_args();
使用 :s
而不是 =s
使选项的参数按照评论中的要求可选。
用于完成上述操作的辅助子示例:
sub help {
my $prog = basename($0);
say "usage: $prog [options]";
say " $prog --help";
say "";
say "Options:";
say " --qp path ...explanation...";
say " --qp ...explanation...";
say " --pr path ...explanation...";
say " --pr ...explanation...";
say " --rp path ...explanation...";
say " --rp ...explanation...";
say " --vr path ...explanation...";
say " --vr ...explanation...";
exit(0);
}
sub usage {
my $prog = basename($0);
warn(@_) if @_;
warn("Try `$prog --help' for more information\n");
exit(1);
}
关于Perl,如何将 argv 读取为散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44346373/