0

スクリプトを実行した後、ユーザー コマンドからオプションとその引数をログに記録したいと考えています。

次のコマンドを検討してください。

./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

4 に答える 4

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各オプションの後に、それが引数を取ることを示すことに注意してください。

編集:以下の説明ごとに回答を更新しました。

于 2011-02-09T12:16:28.710 に答える
1

次のコードは、目的を達成するための 2 つの方法を示しています。

「自家製」の方法では、map と join を使用してオプション リストを生成します。(grep は undef オプションを削除します。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}
于 2011-02-10T05:23:22.257 に答える
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
于 2011-02-09T12:29:30.997 に答える
0

MooseX::Getopt をチェックしてください。次の 2 つの点で役立ちます。

  1. 最新の OO perl に入る

  2. 非常にシンプルなコマンド ライン アプリを作成します。

MooseX::App::Cmd を確認してください。ロジックを分離するのにも役立ちます。または、Moose クールエイドをまだ飲みたくない場合は、App::Cmd を使用します。

于 2011-02-10T18:47:24.860 に答える