2016-05-17 11 views
1

多くのコマンドラインオプションを渡して私のperlスクリプトを呼び出します。スクリプトの起動中に必要なコマンドラインオプションがユーザーによって渡されない場合、スクリプトは終了する必要があります。現在、私はif statementを使って簡単なチェックをしています。必要な引数が10より大きい場合は、If文を使用してclunkyになります。私はif文を使うよりも良い方法があるのだろうかと思っています。perlのコマンドラインオプション

コマンドラインオプション:

sub startup { 
    my ($self) = @_; 

    GetOptions (
     "endpoint|e=s"   => \$self->{'endpoint'}, 
     "port|pt=s"    => \$self->{'port'}, 
     "client|c=s"    => \$self->{'client'}, 
     "client_interface|ci=s" => \$self->{'client_interface'}, 
     "origin|o=s"    => \$self->{'origin'}, 
     "origin_interface|oi=s" => \$self->{'origin_interface'}, 
     "customer_id|cid=s"  => \$self->{'customer_id'}, 
     "endpoint_id|eid=s"  => \$self->{'endpoint_id'}, 
     ) || $self->abort("Invalid command line options. 
       Valid options are endpoint,port,client,client_interface, 
    origin,origin_interface,customer_id,endpoint_id"); 

#Terminate --endpoint IPと--customer idとは、スクリプトを呼び出すために

if (!$self->{'endpoint'} || !$self->{'customer_id'} || !$self->{'client'}){ 
     $self->abort('[Startup] endpoint customer and client are required arguments.' 
         . 'Please provide --endpoint and --customer id and -- client '); 
    } 

コマンドを--client渡されていない場合は、スクリプトの実行:

./testframework --scriptname -- --endpoint=198.18.179.42 --port=5000 --client=1.1.1.1 --client_interface=2.2.2.2 --origin=3.3.3.3 --origin_interface= --Outertunnel=Tunnel0 --Innertunnel=Tunnel2 --customer_id=900010 --endpoint_id=2859588 
+2

「GetOptions」の使用が正しいと思います。しかし、あなたは設計上の問題を示している可能性のあるパラメータが多すぎます...これらの議論には妥当なデフォルトがありますか?それらは特定のマシンに結び付けられているので、代わりに設定ファイルの一部になるのに適していますか?それらを入力として提供するのではなく、スクリプトで直接推測することはできますか?私はむしろそれに取り組んでいます。 – eballes

+0

@eballes IPは異なっています。私はGetOptionsから取り除くことができるものは何もありません。私たちは複数のテストベッドを持っており、すべてのマシンでスクリプトを実行します。 – user3587025

+2

'Getopt :: Args'では必要なオプションを指定できます(矛盾?)。 – toolic

答えて

7

以下のバージョンがclunkinessの一部を削除します。

my @required = qw(endpoint customer_id client); 

if (my @missing = grep { !$self->{$_} } @required) { 
    $self->abort("[Startup] Missing required arguments: @missing"); 
} 
2

一つの方法は、List::Utilからallを使用することです:

unless (all { defined $self->{$_} } qw(endpoint customer_id client)){ 
    # error 
} 

あなたがList::Utilの最新バージョンを持っていない場合、あなたはちょうどあなたがあなたのハッシュで定義されたキーの適切な数を持っていることを確認するためにチェックすることができList::MoreUtils

+0

あなたのソリューションは、私が現在使っているものよりもどのように優れていますか?私は10オプションがある場合、私はqw(エンドポイントcustomer_idクライアントoption4オプション5 ......オプション10)のすべてのオプションを指定する必要があります。私は現在stmtを使用して現在何をしているかに似ています – user3587025

+2

@ user3587025はい、この答えはまだifステートメントを使用します。しかし、冗長な '!$ self - > {'...'} ||'を必要としないため、コードを少なくする必要があります。 'Getopt :: Long'は必須のオプションを指定する本来の方法はありません。 – toolic

2

を使うのか?

my @options = grep { defined $self->{$_} } keys %{$self}; 
die "Missing options\n" unless @options == 10; 

それとも、自分の使用方法の説明文がより明確になりたい場合:より具体的なエラーメッセージを提供しながら、

for my $opt (keys %{$self}) { 
    die "Missing option --$opt\n" unless defined $self->{$opt}; 
} 
+0

この解決策は、必須の引数とオプションの引数を区別しません。私はそれが最も票を持っていることに驚いています。 – tjd

+1

私は元の質問をすべてのオプションが必要であることを意味すると解釈しました。 –

+1

でも、そうでなくても簡単に変更できます。 '$ self - > {required} = {}'を作成し、 'GetOptions'の必須パラメータを変更して、この新しい内部ハッシュのメンバへの参照を指し、メインの'%{$ self} ' –

関連する問題