2

構成スクリプトからの引数を処理するために Getopt::Long をセットアップしようとしています。

これが私のスターターです。

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;

my $config_file = '';

GetOptions (

    'config|c=s' => \$config_file,
    'add|a' => \&add_server,
    'del|d' => \&del_server,

);

sub add_server {

print "$config_file\n";

}

sub del_server {

# Left blank for now.

}

奇妙なことに、このようなスクリプトを実行すると問題が発生します。

./config.pl -a -c config.xml

オプションは出力されません-cが、このように実行すると、

./config.pl -c config.xml -a

それは正常に機能します。

その理由は理解できたと思いますが、それは注文の実行に関係していますよね?

問題は、どうすれば修正できるかです。Getopt::Long を @ARGV と組み合わせて使用​​する必要がありますか?

最終的に、呼び出しているサブルーチンにコマンド ライン引数を渡そうとしています。したがって、サブルーチンが呼び出されたときにサブルーチンに渡す-a or --addオプションが必要な場合。-c or --config

何か案は?

4

5 に答える 5

3

呼び出しから直接サブルーチンを呼び出す必要はありませんGetOptions。次のように順序を制御します。

use strict;
use warnings;
use Getopt::Long;

my %opts = (config => '');

GetOptions(\%opts, qw(
   config|c=s
   add|a
   del|d
));

add_server() if $opts{add};
del_server() if $opts{del};

sub add_server {    
    print "$opts{config}\n";
}

sub del_server {}
于 2011-12-13T01:01:59.977 に答える
0

コールバックは、オプションが検出されると呼び出されるため、実行時に検出add_serverされる前に呼び出され-cます。

./config.pl -a -c config.xml

最新の情報に基づいて、次のことが必要になります。

use Getopt::Long qw( GetOptions );

GetOptions(
   'a=s' => \my $opt_a,
   'd=s' => \my $opt_d,
   'h=s' => \my $opt_h,
   'p=s' => \my $opt_p,
) or usage();
于 2011-12-13T01:33:03.923 に答える
0
GetOptions(
        'arg=s' => sub { print "$_[1]\n"; },
);
于 2014-07-02T14:51:28.077 に答える
-1

Getopt :: Longでpass_throughオプションを有効にして、不明なオプションを無視するようにします。次に、オプションに対してGetOptionsを1回呼び出し、再度無効にしてから、コマンドに対してGetOptionsを再度使用します。

于 2011-12-13T00:48:07.097 に答える