2009-10-22 11 views
10

私はPerlスクリプトでGetopt::Stdを使ってコマンドラインから値を収集しようとしています。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; 

ここで最初の二つの変数($入力ファイルは、$ OUTPUTFILE)が必須ですが、最後の変数($ PARAMETER_VALUE)はオプションであり、無視することができます。

-pフラグがコマンドラインで無視されたときに、最後の変数($ parameter_value)にデフォルト値を設定しようとしています。

は、私はこれを使用してみました:ここ

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

そのパス-pフラグは、コマンドラインでは無視され、正しい値。しかし問題は、私がコマンドラインからいくつかの値を提供しているとき(例えば-p 58)、コマンドラインから渡された58の代わりに同じ値20がプログラムに渡されるときです。

ここで間違いを指摘して私を助けてもらえますか?

ありがとうございます。

答えて

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 
input 
output 
55 
 
C:\Temp> ks -iinput -ooutput 
input 
output 
20 
+0

良い+1 :) = +1 – DVK

+0

thanx Sinan、これはとてもうまく動作し、コーディングのフォーマットを保持します。 Thanx a ton。 – Suren

+5

5.10+を使用している場合、後者は定義済みではなく真理をテストするので、 '||'の代わりに '/'を使う方が良いでしょう。偽の値(0など)を渡すことができなくなります。 5.10より前の同等の動作を得るには、 '$ x = defined $ y? $ y:Z'ここで 'Z'はデフォルト値です。 –

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; 
+0

それが機能するようになりましたおかげでブライアンd個のフォイ:) – Suren

+2

;);););););) – DVK

+0

シナン - (1)あなたは、単に:-(冗談を破壊し;(2)ですか私は同じ日に私の投稿を編集しているPerlの2人の芸術家のためにバッジを手に入れましたか?:) – DVK

1

してデフォルト値を渡すことができ、私は、getoptsはを呼び出す前にデフォルトにオプト変数を設定することをお勧めします。さらに、使用法のメッセージで$ 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; 
+0

また、必要に応じて '$ opt_i'を使用してください。それがパラメータであることは明らかです。 – Otheus

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"; 
関連する問題