4

私はこのgetoptを持っています:

GetOptions(  GetOptions ("library=s" => \@libfiles);
    @libfiles = split(/,/,join(',',@libfiles));
     "help" => \$help,
     "input=s" => \$fileordir,
     "pretty-xml:4" => \$pretty
);

Getopt::Long::GetOptions同じオプションがコマンドラインで複数回提供されているかどうかを検出することは可能ですか?たとえば、次のエラーを生成したいと思います。

perl script.pl --input=something --input=something

ありがとう

4

1 に答える 1

7

直接的な方法はないと思いますが、2つの選択肢があります。

  • 配列を使用して、オプションの処理後に確認してください

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    use Getopt::Long;
    
    my @options;
    my $result = GetOptions ('option=i' => \@options);
    
    if ( @options > 1 ) {
       die 'Error: --option can be specified only once';
    }
    
  • サブルーチンを使用して、オプションがすでに定義されているかどうかを確認します

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    use Getopt::Long;
    
    my $option;
    my $result = GetOptions (
        'option=i' => sub {
            if ( defined $option) {
                die 'Error: --option can be specified only once';
            } else {
                $option = $_[1]; 
            }
        }
    );
    

    この場合!、の先頭に感嘆符を使用するdieと、エラーがキャッチされ、通常のGetoptエラーとして報告されます(詳細については、Getopt :: Longのドキュメントを参照してください)。

于 2012-04-06T15:13:00.763 に答える