gpt4 book ai didi

Perl,如何将 argv 读取为散列?

转载 作者:行者123 更新时间:2023-12-05 08:27:11 26 4
gpt4 key购买 nike

所以,我已经阅读了一些关于如何使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com