getOpt :: std를 사용하여 기본값을 설정하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/1609060

  •  05-07-2019
  •  | 
  •  

문제

나는 명령 줄에서 값을 수집하려고합니다. getopt :: std 내 perl 스크립트에서.

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)는 선택 사항이며 무시할 수 있습니다.

나는 기본적으로 마지막 변수 ($ parameter_value)에 약간의 값을 설정하려고합니다. -p 명령 줄에서 플래그가 무시됩니다.

나는 이것을 사용했다 :

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

여기에서 -p 플래그가 명령 줄에서 무시 될 때 올바른 값을 전달합니다. 그러나 문제는 명령 줄 (예 : -p 58)에서 약간의 값을 제공 할 때, 명령 줄에서 전달한 58 대신 동일한 값 20이 프로그램에 전달됩니다.

내가 여기서 저지르는 실수를 지적하여 나를 도와 줄 수 있습니까?

고맙습니다.

도움이 되었습니까?

해결책

#/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

다른 팁

가장 좋은 점은 사용하는 것입니다 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;

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;
#/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";
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top