質問の歴史:
最初のPerlのバージョンから、変数@ARGVはコマンドライン引数のリストを提供していました。しかし、手動での解析はエラーを引き起こしやすかったです。可読性と柔軟性を向上させるために、Getopt::Stdモジュールが登場し、さらにGetopt::Longや外部のCPANモジュール(例えば、MooX::Options、Getopt::Euclid)が出てきました。
問題:
「手動」解析はしばしば負の数、必須および複数のフラグ、スペースを含むパラメータを考慮しません。異なる構文形式(--flag=value、-abc、混合位置)は、スクリプトを使いにくくし、引数の順序が変わると簡単に壊れることがあります。
解決策:
Getopt::Longを使用してオプションとフラグの高度な解析を行います。これにより、長い/短いオプション、自動検出のバリエーション、配列、ハッシュ、さまざまなフラグ形式をサポートします。非常に複雑なCLIインターフェースの場合は、CPANモジュールを使用してパラメータを宣言的に記述します(MooX::Options、MooseX::Getopt)。
コード例:
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose is $verbose Count is $count Files: @files ";
主な特徴:
Getopt::Stdのみを使用した場合、位置引数とオプション引数をどう区別しますか?
Getopt::Stdは長い名前付きオプションを扱うことができず、位置引数を自動的に区別することもできません。短いフラグを解析した後、位置引数は@ARGVに存在しますが、複雑な構文をサポートするには手動で作業が必要です。
Getopt::LongとGetopt::Stdの主な違いは何ですか?
Getopt::Stdは短い(一文字)オプションのみをサポートしていますが、Getopt::Longは長いフラグ、値のタイプ、配列/ハッシュを解析し、非文字キーをサポートします。
STDINからパラメータを受け取ることができますか?@ARGVだけでなく?
はい、可能ですが、これはGetopt::Longの標準ではありません。混合CLIとSTDINの入力を扱うには、手動でSTDINを読み取り、その入力を解析ロジックに統合する必要があります。
スクリプトは@ARGVから各引数を手動でループして解析し、--argの後の値、--の処理、負の数の誤った処理(例えば、-5がフラグになる)を忘れてしまいます。
長所:
短所:
ファイルの先頭にあるすべての変数の短い説明とともにGetopt::Longを使用します。配列、必須項目、フォーマット検証、ヘルプの出力がサポートされています。
長所:
短所: