10

我正在尝试在我的 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;

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

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

我尝试使用这个:

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

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

你能帮我指出我在这里犯的错误吗?

谢谢你。

4

4 回答 4

18

最好的办法是使用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;
于 2009-10-22T18:20:22.180 回答
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;
C:\Temp> ks -iinput -ooutput -p55
输入
输出
55
C:\Temp> ks -iinput -ooutput
输入
输出
20
于 2009-10-22T18:23:11.240 回答
1

我建议在调用 getopts 之前将 opt 变量设置为默认值。此外,您可以在使用消息中使用 $opt_ 变量来显示默认值。

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;
于 2013-08-08T00:20:40.727 回答
0
#/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";
于 2016-02-17T09:54:25.357 回答