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

I am trying to collect the values from command line using Getopt::Std in my Perl script.

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;

Here the first two variables ($inputfile,$outputfile) are mandatory but the last variable ($parameter_value) is optional and can be ignored.

I am trying to set some value by default to the last variable ($parameter_value) when the -p flag is ignored at the command line.

I tried using this:

my $parameter_value = our $opt_p || "20";

Here its passes the correct value when -p flag is ignored at command line. But the problem is when I am providing some value from the command line (for instance -p 58), the same value 20 is passed to the program instead of 58 which I passed from command line.

Can you please help me out by pointing the mistakes I am making here?

Thank you.

#0

The best thing is to use GetOpt::Long and use a hash instead of individual variables. Then you can pass default values by pre-populating the array

    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;

#1

#/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;
C:\Temp> ks -iinput -ooutput -p55
input
output
55
C:\Temp> ks -iinput -ooutput
input
output
20

#2

I suggest setting the opt variables to defaults prior to calling getopts. Additionally, you can then use the $opt_ variables in your usage message to show the default values.

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;
our $opt_p = 20;
sub HELP_MESSAGE { print " -p  parameter value (default $opt_p)\n"; }
getopts('i:o:p:');
my $inputfile = our $opt_i;
my $outputfile = our $opt_o;
my $parameter_value = our $opt_p;

#3

#/usr/bin/perl
use strict;
use warnings;
use Getopt::Std;

$Getopt::Std::STANDARD_HELP_VERSION = 1;

my %opts = ();
getopts('i:o:p:', \%opts);
my $inputfile = $opts{i};
my $outputfile = $opts{o};
my $parameter_value = $opts{p} || "20";
print "$inputfile, $outputfile, $parameter_value\n";

推荐文章

jQuery滑块帮助

jQuery滑块帮助

推荐文章

轨道控制器,未定义的方法基于误差的边外导轨

轨道控制器,未定义的方法基于误差的边外导轨

推荐文章

此行正在覆盖数组

此行正在覆盖数组

推荐文章

如何提交包的更新?

如何提交包的更新?

推荐文章

为什么Python/C API会在PyRun_SimpleFile上崩溃?

为什么Python/C API会在PyRun_SimpleFile上崩溃?

推荐文章

如何模拟堆栈溢出SSO?尤其是它与serverfault.com联合的地方?

如何模拟堆栈溢出SSO?尤其是它与serverfault.com联合的地方?

推荐文章

我应该隐藏还是销毁UI元素?

我应该隐藏还是销毁UI元素?

推荐文章

将Twitter搜索结果中的JSON字符串转换成Java进行解析

将Twitter搜索结果中的JSON字符串转换成Java进行解析

推荐文章

为什么我不能分配给object()实例的未声明属性,但我可以使用自定义类?

为什么我不能分配给object()实例的未声明属性,但我可以使用自定义类?

推荐文章

驱动程序如何成为操作系统的一部分?

驱动程序如何成为操作系统的一部分?

推荐文章

如何在php数组中传递空键

如何在php数组中传递空键

推荐文章

免费的ASP.NET shoutbox/聊天

免费的ASP.NET shoutbox/聊天

推荐文章

Django的HttpResponseRedirect()+reverse()在URL中截断端口号

Django的HttpResponseRedirect()+reverse()在URL中截断端口号

推荐文章

在分叉开放源码软件之前等待的时间?

在分叉开放源码软件之前等待的时间?

推荐文章

确保文件上传正常!你上传了什么?

确保文件上传正常!你上传了什么?

推荐文章

教义问题?

教义问题?