2012-05-11 21 views
4

私はperlスクリプトを実行しており、コマンドラインから複数の値を取得する必要があります。例:私はGetoptの::ロングを使用していると私はこれが仕事を得ることができます複数の値を持つコマンドライン引数

perl script.pl --arg1 op1 op2 op3 

perl script.pl --arg1 op1 --arg1 op2 --arg1 op3 

しかし、私は本当に(たい)する必要が最初のオプション。

私は彼らのドキュメントで確認し、これは私がやりたいことになっている:

GetOptions('arg1=s{3}' => \@myArray); 

http://search.cpan.org/~jv/Getopt-Long-2.38/lib/Getopt/Long.pm#Options_with_multiple_values

しかし、私はこのエラーを取得しています:

Error in option spec: "arg1=f{3}"

任意のアイデア/ソリューション?

+0

あなたのスクリプトの引数の別のユーティリティが必要ですか?コマンドラインから渡された引数はすべて、$ ARGV配列に格納されます。スクリプト内で内部的にソートして追跡することができます。 ソース:http://www.cyberciti.biz/faq/howto-pass-perl-command-line-arguments/ また、1つの引数を含めることができ、ユーザーは引用符で囲む必要があります:perlスクリプト。 pl - arg1 "op1 op2 op3" – OrionRogue

+0

私は引用符について考え、別の解決策が見つからない場合はこれを使用して終了する可能性があります。私はおそらく$ ARGVを使うことができると知っていますが、私は多くの議論を持ち、Getopt :: Longは本当にすべてを追跡し、残念ながらARGVを変更するのに役立ちます。 – Chris911

+0

ちょっとしたアイデア:シェルに何か問題があるかもしれません。スクリプトで期待することを得るために、簡単なプリントデバッグを行うことができますか? – ArtM

答えて

4

あなたのコードは私のために働いていますが、その機能はGetopt :: Longに最近追加されたようです(バージョン2.35)ので、古いバージョンのGetopt :: Longがあるかもしれません。あなたが持っているバージョンを確認するには、

perl -MGetopt::Long -le'print $Getopt::Long::VERSION;' 

をご覧ください。

+0

さて、私はすでにバージョンをチェックしており、私は2.38を実行しています。しかし、私はちょうどクライアントが古いバージョンのperlまたはそのサーバを使用している可能性があることを知ったので、別の解決策を見つけなければならないかもしれません。それでも、ここではうまくいきません。 – Chris911

+3

それは変です。助けがあれば、perl 5.8.8で2.35を実行していました。 Getopt :: Longを使い続けたいが、独自の@ARGV処理を混在させたい場合は、Getoptionsを実行する前に 'Getopt :: Long :: Configure( 'pass_through');を追加する。そうすれば、GetOptionsが認識できないものは@ARGVに残され、自分で処理することができます。 –

+0

ありがとう、私はpass_throughを見ていきます。 Perl v5.10.1とGetopt :: Long v2.38はここにあります。 – Chris911

4

あなたの問題はf{3}と思われます。 fは、float引数(実数)に使用されます。 文字列を引数として使用する場合は、s指定子を使用する必要があります。議論数については、

It is also possible to specify the minimal and maximal number of arguments an option takes. foo=s{2,4} indicates an option that takes at least two and at most 4 arguments. foo=s{,} indicates one or more values; foo:s{,} indicates zero or more option values.

となります。ドキュメントからのヒントを考慮して、必要に応じて調整してください。

+0

実際に私が使用している例のfについては、私の悪いです。私はすでに文書を読んで、利用可能なすべてのオプションを試しました。 – Chris911

2

私はこのソリューションを提供しなかった理由はわかりませんが、この投稿は古くなっています。

これを行うための自動方法はありません。あなたがする必要がどのような

がquote複数の引数で、コードの中にそれらを解析:

perl myscript.pl -m 'a b c' 

をして、コード内の-m引数の値を分割し、そこから必要なものは何でも。

0

同様の質問getoptions function perl multi value not workingと私は思う...とにかく、それはちょうど"optlist=s" => \@list,私のために働く、重複する/繰り返しのオプションを配列に格納するために使用するようだ。これは私のバージョンです:

$ perl --version | grep This && perl -MGetopt::Long -le'print $Getopt::Long::VERSION;' 
This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi 
2.38 

例(test.pl):

#!/usr/bin/perl 
use strict; 
use warnings; 
use Getopt::Long; 
my $numone = 0; 
my $numtwo = 1; 
my @list=(); 
my $result; 
$result = GetOptions (
    "numone=i" => \$numone, 
    "numtwo=i" => \$numtwo, 
    "optlist=s" => \@list, 
); 

printf("result: %d;\n", $result); 
printf("numone: %d, numtwo %d, optlist:\n", $numone, $numtwo); 

foreach my $tmplist (@list) { 
    printf(" entry: '%s'\n", $tmplist); 
} 

テスト出力:

$ perl test.pl --numone 10 --numtwo 20 --optlist testing --optlist more --optlist options 
result: 1; 
numone: 10, numtwo 20, optlist: 
entry: 'testing' 
entry: 'more' 
entry: 'options' 
関連する問題