二重ダッシュ (--) で終わる値リストを受け取り、オプションを指定する perl スクリプトに書き留めたいと思います。例:
% perl_script -letters a b c -- -words he she we --
このコマンド ラインを実行すると、2 つの配列が作成されます。言葉 = [彼は私たち];
GetOption の使用はこれをサポートしません。bc を使用した後、ダブル ダッシュを使用すると、オプションの認識が停止します。
このような紛らわしい区切り記号を使用する特定の理由はありますか? --
ほとんどのスクリプト ユーザーには既知の意味がありますが、これは違います。
リストを使用してオプションを読み込む必要がある場合Getopt::Long
、入力配列を処理するメソッドがあります。おそらく、このようなものが役立ちます。「複数の値を持つオプション」の下を見てください。このモジュールは標準ディストリビューションに含まれているため、何もインストールする必要さえありません。複数 (おそらく 2 つ) の入力を必要とするスクリプトに使用し、入力がオプションである場合は間違いなく使用します。
簡単な例を次に示します。入力構文を柔軟に変更できる場合は、要求している機能が得られます。
#!/usr/bin/env perl
# file: test.pl
use strict;
use warnings;
use Getopt::Long;
my @letters;
my @words;
GetOptions(
"letters=s{,}" => \@letters,
"words=s{,}" => \@words
);
print "Letters: " . join(", ", @letters) . "\n";
print "Words: " . join(", ", @words) . "\n";
与えます:
$ ./test.pl --letters a b c --words he she we
Letters: a, b, c
Words: he, she, we
独自のパーサーを作成することを決して奨励するつもりはありませんが、なぜ誰かがあなたのフォームを選択するのか理解できませんでした。そのため、あなたがこのフォーマットを制御できず、回避する必要があるという前提で操作します。その場合 (そうでない場合は、より標準的な構文を検討し、上記の例を使用してください)、簡単なパーサーを使用して作業を開始してください。
注: 自分で作成しない理由は、他の人が十分にテストされており、問題が解決されているためです。--
また、 aと a の間の何かをどうするか知っています-title
か? 新しい -title は前のものを終了するため、間に何かがあり、これらすべてを「デフォルト」キーにまとめている可能性があると思いました。
#!/usr/bin/env perl
# file: test_as_asked.pl
# @ARGV = qw/default1 -letters a b c -- default2 -words he she we -- default3/;
use strict;
use warnings;
my %opts;
# catch options before a -title (into group called default)
my $current_group = 'default';
foreach my $opt (@ARGV) {
if ($opt =~ /\-\-/) {
# catch options between a -- and next -title
$current_group = 'default';
} elsif ($opt =~ /\-(.*)/) {
$current_group = $1;
} else {
push @{ $opts{$current_group} }, $opt;
}
}
foreach my $key (keys %opts) {
print "$key => " . join(", ", @{ $opts{$key} }) . "\n";
}
与えます:
$ ./test_as_asked.pl default1 -letters a b c -- default2 -words he she we -- default3
letters => a, b, c
default => default1, default2, default3
words => he, she, we
どうですか
-letters "a b c" -words "he she we"
?
必要に応じて、複数のパスで引数を処理できます。pass_through オプションを見てください。これは、一部のオプションが他のオプションに影響を与えるため、ackで行うことです。そのため、最初に --type オプションを処理し、次に残りを処理する必要があります。