2011-02-09 1 views
0

スクリプトを実行した後に、userコマンドからオプションとその引数を記録します。コマンドラインオプションとその値の取得

./test.pl --ip localhost --id 400154 --class firstgrade 

...と他の多くのオプションと値:

は、このコマンドを考えてみましょう。私の所望の出力は、(log4perlを使用して)、このようになります:

debug - ip=>localhost id=>400154 class=>firstgrade 

私は:

use Getopt::Long; 
my $ip; 
my $id; 
my $class; 
my %h =('ip' => \$ip, 
     'id' => \$id, 
    'class' => \$class); 
GetOptions(\%h); 
$logger->debug(join('=>',%h)); 

が、それは動作しません。助けてください。

答えて

4

コードはGetopt::Longの2つの異なる機能の奇妙な組み合わせです。オプションをハッシュに解析したり、個々のオプションを変数に入力することができます。ハッシュに入れて残りを変数に入れることさえ可能です。

これは動作するはずです:これは、解析されたオプションはハッシュに入れている変種が

use Getopt::Long; 

my @options = qw(ip id class); 
my %h =(); 
GetOptions(\%h, 
    map { "$_:s" } @options 
) or die "Could not parse"; 
warn map { "$_=>$h{$_} " } keys %h; 

です。それぞれのオプションの後ろに、引数をとることを示すために:sを記述してください。

編集:以下の説明に従って回答を更新しました。

+0

返信ありがとうございます。しかし、私は間違った方法で問題を説明していると思います。私は各コマンドに50以上のオプションがあるので%hashを定義しました。これらのオプションは静的で、コマンドからそれらの値(例えば--ip localhost)を得ることができるはずです。これは私の問題です。 Imがクリアされない場合は、もっと詳しく説明してください。 –

+0

@Matt Ston:答えを更新しました。現在、@options配列からオプションのリストが生成されています。この方法で、任意の数の予想されるオプションを渡すことができます。 – bvr

+0

あなたのコードによると、どのように@options要素を印刷することができますか?それは、ハッシュ形式のマップを警告するようなオプションと関連する引数を意味しますか? –

1

はこのお試しください:

my $ip = ""; my $id = ""; my $class= ""; 
GetOptions('ip=s' => \$ip, 'id=s' => \$id, 'class=s' => \$class); 
print "debug - ip=>$ip id=>$id, class=>$class"; 

をそして、あなたは、おそらくこのようにそれを呼び出す必要があります:

./test.pl --ip localhost --id 400154 --class firstgrade 
+0

あなたの助けに感謝します。しかし、私はそれを意味する;) –

1

次のコードは、あなたが望むものを達成する2つの方法を示しています。

'home grown'メソッドは、mapとjoinを使用してオプションリストを生成します。 grep {}部分を削除することができます。

Data :: Dumperメソッドは、評価可能なので望ましいかもしれません。


#!/usr/bin/env perl 

use strict; 
use warnings; 

use Getopt::Long qw(:config gnu_getopt); 
use Data::Dumper; 
$Data::Dumper::Sortkeys = 1; 
$Data::Dumper::Indent = 0; 
$Data::Dumper::Terse = 1; 

my %opts = (
    dir => undef, 
    verbose => 0, 
    silent => 0, 
); 

GetOptions(\%opts, 
      'dir|d=s', 
      'verbose|v+', 
      'silent+', 
     ) 
    or die("Usage: blah\n"); 

# also see Getopt::Long perldoc for pod2usage 

print("home grown:\n", 
     join(" ", map { sprintf('%s=>%s',$_,$opts{$_}||'undef') } 
       grep {defined $opts{$_}} keys %opts), 
     "\n"); 

print("Dumper:\n", 
     Dumper(\%opts), 
     "\n"); 

例:

apt12j$ ~/tmp/x.pl -vv --silent 
home grown: 
verbose=>2 silent=>1 
Dumper: 
{'dir' => undef,'silent' => 1,'verbose' => 2} 
+0

ありがとう、あまりにも、私は今どのように幸せを想像できない:) –

+0

最後の質問: 私は他の方法の中で引数を得ることができます、私はこれらの引数を送信する方法がありますメール機能を介して。 'my $ TicketID = $ TicketObject-> TicketCreate( \t#id、ip、classの値を取得したいのですが、これらのユーザーはコマンド id => '?'、 class => 'に入力しますか? '、 ip =>'? '、 ); –

+0

これは難しくありません。DIが答えを得ました。もう一度問題を解決しました:) –

0

アウトMooseX :: Getoptの、それはあなたの2倍をお手伝いします:

  1. は、近代的なオブジェクト指向のperlにあなたを取得

  2. スーパーシンプルなコマンドラインアプリを作成します。

Checkout MooseX :: App :: Cmd。あなたのロジックを分離するのにも役立ちます。またはApp :: Cmdあなたがまだムース・クール・エイドを飲みたくなければ。

+0

私はそれを確認します、ありがとう:) –

関連する問題