2016-06-01 5 views
3

::ロングバージョン2.39は、私は私が-cを使用している場合、デフォルト値は%optsで20置かれることを示すためには、どのように私はPerlのGetoptので

use Getopt::Long qw(:config gnu_getopt); 
GetOptions(
    \my %opts, 
    "codon-view|c:20", # Optional value, default 20 
    "consensus|C:50", 
    ... 
) 

を使用することができ、デフォルトオプションの値を設定しませんcodon-viewの場合、-cが指定されていますが、明示的な値はありません。一方、-cまたは--codon-viewが指定されていない場合、ハッシュテーブルの値は%optsに格納されません。 2.48この中

はもはや機能していないと私はどのように私は古い動作を達成することができますGetopt::Long's documentation

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.39 
20 

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

に表示されないのですか?

ヘルプ!

+0

2.39で正常に機能しましたか? 2.24(2000年にリリース)、[値付きオプションのドキュメント](https://metacpan.org/pod/release/JV/Getopt-Long-2.24/lib/Getopt/Long.pm# Options with-values)は、 'tag = s'や' tag:i'のような形式のオプション指定を一貫して表示します。 – ThisSuitIsBlackNot

+0

これを含めるように投稿を修正しました。あなたが得るものは私の行動にマッチします。それは、 '-c'または' --codon-view'が与えられ、その挙動が2.39と2.48の間で変化する値がないときだけです。また、 'gnu_getopt'に関して、これら二つのバージョン間で変化するFindOptionの変更があります。 – rocky

+1

@ThisSuitIsBlackNot、 ':number'を検索 – ikegami

答えて

5

これは2.48で導入された変更です。

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.47 
20 

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

私はわからないんだけど、私はそれが意図せずに行われていたと思うので、私はbug reportを提出しました。


use Getopt::Long qw(:config gnu_getopt); 

投資をどのように

use Getopt::Long qw(:config gnu_compat bundling permute no_getopt_compat); 

のために短いです、あなたはgnu_compatを使用していますか?

$ perl -E' 
    use Getopt::Long qw(:config gnu_getopt); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

$ perl -E' 
    use Getopt::Long qw(:config gnu_compat bundling permute no_getopt_compat); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
[undef] 

$ perl -E' 
    use Getopt::Long qw(:config bundling permute no_getopt_compat); 
    say $Getopt::Long::VERSION; 
    GetOptions(\my %opts, "codon-view|c:20"); 
    say $opts{"codon-view"} // "[undef]" 
' -- -c 
2.48 
20 

gnu_compatコントロールが--opt=かどうかを許可され、それが何をすべきか。 gnu_compatを指定しないと、--opt=にエラーが発生します。 gnu_compatでは、--opt=はオプションoptと空の値を与えます。これがGNU getopt_long()のやり方です。あなたは--codon-view=$opts{"codon-view"}にゼロを代入して、OKなら

だから、単にここでもう一つの可能​​性が、あまり良い解決策がある

use Getopt::Long qw(:config bundling permute no_getopt_compat); 

代わりの

use Getopt::Long qw(:config gnu_getopt); 
+0

これは使い勝手の良いものなので、ユーザーに実験を依頼する必要があります。私が今行ったことは、モジュールにコピーされた2.39コードを使用することです。あなたが言うことを考えれば、バージョンを2.47程度に増やすことができると思います。 – rocky

+0

もう一度見てください。私のソリューションはあなたのユーザーに影響を与えません。単に '--opt =' stopを実行するとエラーになります。 – ikegami

+0

'gnu_compat'のドキュメントが間違っているようです。 'perl -MGetopt :: Long =:config、gnu_compat -E'GetOptions(\%opts、" foo:1 ")またはdie; 「<$opts{foo}>」と言ってください - --foo = 'prints '<0>'; 'gnu_compat'を削除すると、エラーを出す代わりに' <1> 'が出力されます。 – ThisSuitIsBlackNot

3

GetOptions()コールの前にデフォルト値を設定します。オプションがコマンドラインで指定されていない場合、デフォルト値は上書きされません。

$ perl -MGetopt::Long -E '$c=20;GetOptions("c=i"=>\$c); say $c' -- -c 14 
14 

$ perl -MGetopt::Long -E '$c=20;GetOptions("c=i"=>\$c); say $c' -- 
20 

Getopt::Longドキュメントのa trivial exampleがあります。

+0

私は以前の動作についてはっきりしていなかったと思います。 '-c'が与えられていなければ、そのキーはハッシュにはありません。設定されている場合、そのキーの値はデフォルト値を持ちます。私はこれを反映するために私の質問を編集します。 – rocky

0

私は、ユーザーが引数なしで./you-app -cを実行している場合

GetOptions(\ my %opt, 
    'codon-view|c:i', 
); 

if (exists $opt{'codon-view'}) { 
    print "User triggered '-c' flag\n"; 
    $opt{'codon-view'} ||= 20; 
    printf("codon-view: %d\n", $opt{'codon-view'}); 
} 

は今、$opt{c}キーが作成されますが、それは価値ですがundefあります。..ハッシュに私のOPTSを割り当てることが好きなので、あなたくらいのチェックそれならばexistsでトリガーされました。

||=オペレータは、左側がfalsey(通常はundef)の場合にのみ、右側に右側を割り当てます。注意する点は、誰かが-c 0を実行すると、デフォルトを割り当てます...しかし、私は先に進んで、0がおそらくあなたのフラグのための悪い議論であると仮定します。

+0

申し訳ありません私は自分の状況を完全に報告しませんでした。まず、はい、私はオプションのハッシュを使用します。また、 'use Getopt :: Long qw(config gnu_getopt);'を使用しています。gnu_getoptがuse文で指定されていない場合、あなたの例は動作します。しかし、それが指定されると、あなたの例はもはや機能しません。また、もう少し扱いに​​くく、 'codon-view | c:20'が何をするのかを2つの場所に入れます。 gnu_getoptが指定されているときに問題を解決できれば、解決策が見つからない場合はこれを受け入れます。 – rocky

1

使用:のコピーが含まれますGetopt :: Long.pm、それは唯一のファイルですが、私はパッケージの名前空間を別のものに変更しました。 MyPackage :: GetoptLong。

これは理想的な回答ではありませんが、互換性を保つために何かが必要であり、より良い池上の解決策を持っていない場合は、心に留めておいてください。