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

标签 perl argv

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

相关文章:

regex - 如何解决此匹配并替换perl文件中仅第n次出现的单词的问题

xml - 在 Perl 中添加对 XSLT 的引用,仅使用 XML :LibXML

c - 在 UNIX 中使用 execve() 编写 ls 程序

c - ARGV中的 vector 是指一维数组吗?

c - 用最大输入填充 C 中的 argv[1]

perl - 用空格替换回车,用分号替换逗号?

perl - Expect 模块无法在 perl 中工作

c++ - Wxwidgets/Wx Perl 网格大小问题

c++ - 检查以确保 argv[1] 是整数 C++

将 argv 的每个值与字符串连接起来