2017-04-18 5 views
3

PerlのGetopt::Longは、開発者が独自のオプションをスクリプトに追加できるようにします。正規表現に見られるように、オプションの複数の値をuse of a repeat specifierで許可することもできます。たとえば、次のようにさらに繰り返し指定子を使用する場合でも、Getopt :: Longオプションを追加します。

GetOptions('coordinates=f{2}' => \@coor, 'rgbcolor=i{3}' => \@color); 

option values can be stored in a hash、そのような:

my %h =(); 
GetOptions(\%h, 'length=i'); # will store in $h{length} 

私は何をするときでも、私のオプションのハッシュで終わるためにこれらの2つの方法を組み合わせているやろうとしている彼ら複数の値を持つ

例として、誕生日(3つの整数)、親(1つまたは2つの文字列)、名(ちょうど1つの文字列)の3つのオプションを許可したいとします。 これらの値をハッシュに入れたいとしましょう。

use strict; 
use warnings; 

use Getopt::Long; 
use Data::Dumper; 

my %h =(); 
GetOptions(\%h, 'bday=i{3}', 'parents=s{1,2}', 'name=s{1}'); 

print Dumper(\%h); 

そして、それをテストしたが、次のように出力された:私は、次のことを試してみました

perl optstest.pl --bday 22 3 1986 --parents john mary --name ellen 
$VAR1 = { 
    'name' => 'ellen', 
    'parents' => 'mary', 
    'bday' => 1986 
}; 

各オプションの最後の値だけが実際にハッシュに使用されています。私が望む何を、しかし、次のとおりです。

$VAR1 = { 
    'name' => 'ellen', 
    'parents' => ['mary', 'john'], 
    'bday' => [22, 3, 1986] 
}; 

「エレン」は、アレイにあるであろう、またはすべてがハッシュの中にあった場合、それは同様に罰金になると思います。

Getopt::Longという2つの機能を組み合わせることはできません。つまり、オプションをハッシュに入れ、繰り返し指定子を使用しますか?

答えて

6
use Getopt::Long; 
# enable for debugging purposes 
# Getopt::Long::Configure("debug"); 
use Data::Dumper; 

my %h =(); 
GetOptions(\%h, 'bday=i{3}', '[email protected]{1,2}', '[email protected]{1}'); 

print Dumper(\%h); 

の一部であるperlbugユーティリティを使用したPerl 5ポーターに報告することを示唆しているが何をしたいということですか?

$VAR1 = { 
      'bday' => 1986, 
      'name' => [ 
         'ellen' 
        ], 
      'parents' => [ 
         'john', 
         'mary' 
         ] 
     }; 
+0

私は配列として 'bday'を望んでいましたが、確かに。私は '@ {}'表記が必要です。ありがとう! –

3

アレイが必要な場合は、アレイへの参照を与える必要があります。

local @ARGV = qw(--x y z); 
my %h = (x => []); 
GetOptions(\%h, 'x=s{2}'); 
print(Dumper(\%h)); 

また、配列を指定する必要があります。

local @ARGV = qw(--x y z); 
GetOptions(\my %h, '[email protected]{2}'); 
print(Dumper(\%h)); 

出力:どのような次は実験的な機能である:あなたがへのリンクドキュメントの

$VAR1 = { 
      'x' => [ 
        'y', 
        'z' 
       ] 
     }; 
+0

ありがとうございました!私は最初の選択肢が本当に好きではありません。まず、オプションがCLIで指定されていなくても、空の配列を生成するためです。これは単に実用的ではありません。 'exists $ h {'option'}'でオプションの存在を簡単にチェックすると、設定されていなくても常にtrueが返されます。 GetOptの開発者がこの用途を意図しているとは想像もできません。 2番目の提案はうまくいくので、私はそれを使用します。ありがとう。 –

1

Options with multiple valuesセクションも、この

警告は述べています。

それは

GETOPTIONSに早く言う(\%の時間、 '色=秒@'); #私は

ので、私はそれが繰り返し指定子と同じように動作するのは、著者の意図だったことを推測し、あなたがバグを発見したことを

@ {$ hを{色}}にプッシュしますあなたはそれがPerlのインストール

+1

ここで他の答えを考えても、これはまだバグだと思いますか? '@ {1,2}'を使用することの提案された答えはうまくいきますが、型宣言なしでもうまくいくと思いますか? –

+0

@BramVanroy:もちろんです。使用した構文が正しくない場合は、モジュールで受け入れてはなりません。それが正しい場合、それは動作するはずです。いかなる状況下でも、複数値になるように特別に定義されたパラメータの1つの値を除いて、それを静かに「失う」べきではありません。あなたが好きなら問題を自分で上げますか? – Borodin

+0

@BramVanroy:「parents = s {1,2}」は、単純なスカラのような値を扱うのはナンセンスなので、常に「parents = s @ {1,2}」として動作するべきだと思います。 – Borodin

関連する問題