2017-09-19 1 views
0

私は理解しようとしているコードの一部を次のようしている:私のようにコードを実行するとオプションはPerlのGetopt :: Longでどのように動作するのですか?

use Getopt::Long; 

my $isheader ; 

if(!GetOptions(

    "is-header!"    => \$isheader, 

)) { exit 1; } 

print "isheader is = $isheader\n" ; 

script.pl --is-header 

出力は次のとおりです。私は入れている

isheader is = 1 

a "!" 、第二に

isheader is = 0 

私は、スクリプトを実行する場合:オプション名の末尾にその出力はすべきではないと否定する-ヘッダがある

script.pl --is 

まだ

を印刷することができます
isheader is = 1 

私はPerlがオプションの部分的な名前を展開すると思いますか?

は第三に、私は

script.pl --is-header --is-head 

なぜそれがあいまいなオプションのエラーで失敗しない実行しますか?それは印刷する

isheader is = 1 

また、私は - ヘッダーを置き換えて!上記のコードにis-header +をつけてもまだ出力されています

isheader is = 1 

isheader is = 2、なぜそうでしょうか?

私はhttps://perldoc.perl.org/Getopt/Long.htmlを読み、それを理解するために実験していましたが、私はうんざりしているようです。

+0

否定するために、あなたは、ドキュメントの状態として、 'NOIS-header'を使用しています。 – toolic

答えて

2

Getopt :: Longは、さまざまな引数型をサポートしています。 foo!は、ブール値で--fooオプションを宣言しますが、foo=sでは文字列値が必要です。この場合、!は否定ではありません。オプションを指定するたびにインクリメントされる値を指定する場合は、foo+のようなタイプの+を使用します。詳細はSummary of Option Specificationsをご覧ください。

デフォルトでは、短縮形のパラメータ名は、省略形が明白でない限り、省略可能です。したがって、--house--homeがある場合、--hou--homの両方が認識されますが、--hoは認識されません。 auto_abbrev設定フラグを使用して、この動作を明示的に有効または無効にすることができます。すべての設定オプションについては、Configuring Getopt::Longを参照してください。 Getopt::Long::Configure()機能で設定することができます。

Getopt :: Longは、大量の設定オプションを持つ非常に複雑なモジュールです。どんなことをしても構わないと思うかもしれませんが、私は個人的にはその複雑さと面倒なインターフェースを避けたいと思っています。単純なケースでは、手で引数を解析することはそれほど難しくありません(例えば、引数のないオプションなど)。

+3

Re:*私は個人的に複雑さと煩雑なインターフェイスを避けることを好む "* [wut](https://pastebin.com/Q6f2bsqU) – ikegami

+0

@ikegamiさまざまな設定オプション間のやりとりは重要ではないかもしれません。直感的ではありません - 私は確かに 'auto_abbrev'と' pass_through'の狂気について学ぶことに驚いていました。私の見解はおそらく、Getopt :: Longの機能のサブセットの代わりにドロップインの書き換えを試みたことによって汚染されています。しかし、ええ、私は、Getopt :: Longは、広範囲のユースケースに対して完全にうまくいくと思います。 'posix_default'を最初の設定の出発点として提案していただき、ありがとうございます。 – amon

+0

'pass_through'はデフォルトではオフになっており、状況によっては有効です。特定のオプションがグローバルで特定のオプションが特定のコマンド用のものである場合、 'pass_through'で初期スキャンを使ってグローバルオプションを抽出することができます。 – ikegami

4

「!「オプション名の最後に、あなたがthe documentationを読めば、それはこの言う、実際に

を否定するために、ヘッダーです:

否定の目的オプションは、オプション名

の後に感嘆符を使用して指定されました!

「否定の目的は、」「否定」と同じではありません。

否定の目的は、あなたがオプションの名前の前に「ノー」を含むことにより、オプションをオフにできることを意味します。

script.pl --is_header 

そして

script.pl --nois_header 
関連する問題