ARGV пуст в Perl-скрипте, когда пакет использует getopt

Я использую Getopt::Long для обработки ввода скрипта Perl созданный субмодуль находится в пакете и использует Getopt::Long обрабатывать ввод.

Когда этот подмодуль вызывается в тестовом скрипте Perl, @ARGV пустой.

Пожалуйста, помогите проверить, что не так с моим сценарием?

Когда субмодуль не находится в пакете, а вызывается из оболочки, @ARGV правильно, и это работает хорошо.

Я прочитал Getopt::Long Документация и гуглил, прежде чем спрашивать. К сожалению я не нашел ответа.

Я использую pass_through особенность Getopt::Long потому что я хочу передать его в подмодуль листа.

package getopt_sample;

use Getopt::Long qw(:config pass_through );
use FindBin qw($Bin $Script $Dir $RealBin $RealScript $RealDir);

sub getopt_sample {

    my ( $mode, $mode1, $help );
    $mode           = "";
    $mode1          = "";

    print "$#ARGV\n";
    print "@ARGV\n";

    Getopt::Long::GetOptions(
      "mode=s"              => \$mode,
      "mode1=s"             => \$mode1,
      "help|h"              => \$help
    );

    if ($help) {
        print "help\n";
    }

    print "@ARGV\n";      ### All the remaining unknown options will be left in $ARGV when pass_through
}

1;

Скрипт теста Perl:

#!/usr/local/bin/perl
use lib './';
use getopt_sample;

  &getopt_sample::getopt_sample (
    '-mode'     => "m0",
    '-mode1'    => "m1",
    '-h'
  );

1 ответ

Если вы ничего не нашли в @ARGV когда вы запускаете тестовый скрипт, это происходит потому, что вы не передаете тестовый скрипт никаких аргументов командной строки:

$ ./test_script 
-1


$ ./test_script foo bar baz -h
3
foo bar baz -h
help
foo bar baz

&getopt_sample::getopt_sample ('-mode' => "m0", '-mode1' => "m1", '-h'); ничего не добавляет к @ARGV, Параметры для вызова функции помещаются в @_не @ARGV,

Если вы хотите, чтобы ваш модуль принимал ввод как от @ARGV и из параметров, с которыми вызывается саб, вы можете использовать @ARGV = (@ARGV, @_); в подпункте, чтобы добавить эти параметры в @ARGV,

Кроме того, не используйте префиксы, определяемые пользователем, как префикс &, Это практика Perl 4, которая больше не требуется в Perl 5 и имеет побочные эффекты, о которых вы, вероятно, не знаете и, следовательно, не хотите.

Другие вопросы по тегам