如何使用Getopt :: Std设置默认值?

Sur*_*ren 10 perl getopt

我试图在我的Perl脚本中使用Getopt :: Std从命令行收集值.

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
getopts('i:o:p:');
my $inputfile = our $opt_i;
my $outputfile = our $opt_o;
my $parameter_value = our $opt_p;
Run Code Online (Sandbox Code Playgroud)

这里前两个变量($ inputfile,$ outputfile)是必需的,但最后一个变量($ parameter_value)是可选的,可以忽略.

我试图-p在命令行忽略该标志时默认将一些值设置为最后一个变量($ parameter_value).

我试过用这个:

my $parameter_value = our $opt_p || "20";
Run Code Online (Sandbox Code Playgroud)

在命令行中忽略-p标志时,它传递正确的值.但问题是当我从命令行提供一些值时(例如-p 58),相同的值20被传递给程序而不是我从命令行传递的58.

能否指出我在这里犯的错误,请你帮帮我吧?

谢谢.

DVK*_*DVK 17

最好的方法是使用GetOpt :: Long并使用哈希而不是单个变量.然后,您可以通过预填充数组来传递默认值

    use Getopt::Long;
    my %opts = (parameter => 20);
    GetOptions( \%opts, 
            'p|parameter=i', 
            'o|outputfile=s',
            'i|inputfile=s'
    ) or die "Invalid parameters!";

    # I didn't bother cloning STANDARD_HELP_VERSION = 1;
Run Code Online (Sandbox Code Playgroud)

  • ;);););););) (2认同)

Sin*_*nür 16

#/usr/bin/perl

use strict;
use warnings;

use Getopt::Std;

getopts('i:o:p:');
our($opt_i, $opt_o, $opt_p);

my $inputfile = $opt_i;
my $outputfile = $opt_o;
my $parameter_value = $opt_p || "20";

print "$_\n" for $inputfile, $outputfile, $parameter_value;
Run Code Online (Sandbox Code Playgroud)
C:\Temp> ks -iinput -ooutput -p55
input
output
55
C:\Temp> ks -iinput -ooutput
input
output
20

  • 如果你使用的是5.10+,那么最好使用`//`而不是`||`,因为后者测试真实,而不是定义.它将阻止您传递错误值(例如0).在5.10之前获得等效行为的冗长方式是`$ x =定义$ y?$ y:Z`其中`Z`是默认值. (5认同)
  • 所以,我认为在赋值语句中使用`my`有一些问题,并且事先使用它来修复它?你能扩展一下你的代码和Suren之间的区别吗? (2认同)