Создание копий @ARGV заставит вас снова и снова анализировать один и тот же набор параметров.Если это то, что вы хотите, хорошо.Но.
Предположим, у вас есть набор модулей, которые вы используете в вашей программе, которые могут распознавать только часть вашего @ARGV.Вам нужно вызывать GetOptions для каждого из этих модулей, использовать каждую из опций, которую модуль может распознать, и оставить остальные опции в @ARGV для обработки другими модулями.
Вы можете настроить Getopt :: Long, чтобы сделать это, вызвав
Getopt::Long::Configure qw/pass_through/;
Но смотрите perldoc Getopt :: Long для различных побочных эффектов конфигурации!
Пример: скрипт(o1.pl) способен распознавать несколько опций и два модуля (o1 :: p1 и o1 :: p2), которые должны читать свои собственные опции
o1.pl:
! /Источник usr / bin / perl
use Getopt::Long;
use o1::p1;
use o1::p2;
# now o1::p1 and o1::p2 already consumed recognizable options
#no need to configure pass_through since main:: will get to see only its options
#Getopt::Long::Configure(qw/pass_through/);
my %main_options = ( 'define' => {}, );
print "main: \@ARGV = " . join (', ', @ARGV) . "\n";
GetOptions(\%main_options, "main-vi=i","verbose",'define=s');
use Data::Dumper;
print "main_options: ", Dumper(\%main_options);
print "p1 options: ", Dumper(\%o1::p1::options);
print "p2 options: ", Dumper(\%o1::p2::options);
exit 0;
o1 :: p1 (в o1 / p1.pm):
package o1::p1;
use Getopt::Long;
Getopt::Long::Configure qw/pass_through/;
%options = ();
print "package p1: \@ARGV = " . join (', ', @ARGV) . "\n";;
GetOptions(\%options, "p1-v1=s", "p1-v2=i");
1;
o1 :: p2 source (в o1 / p2.pm):
package o1::p2;
use Getopt::Long;
Getopt::Long::Configure 'pass_through';
%options = ();
print "package p2: \@ARGV=". join (', ', @ARGV). "\n";
GetOptions(\%options, "p2-v1=s", "p2-v2=i");
1;
при запуске o1.pl с:
perl o1.pl --main-vi=1 --verbose --define a=ss --p1-v1=k1 --p1-v2=42 --define b=yy --p2-v1=k2 --p2-v2=66
даст следующий (ожидаемый) вывод (p1 использовал свои параметры, затем p2 сделал это, затем main был оставлен со чем оно знает):
package p1: @ARGV = --main-vi=1, --verbose, --define, a=ss, --p1-v1=k1, --p1-v2=42, --define, b=yy, --p2-v1=k2, --p2-v2=66
package p2: @ARGV=--main-vi=1, --verbose, --define, a=ss, --define, b=yy, --p2-v1=k2, --p2-v2=66
main: @ARGV = --main-vi=1, --verbose, --define, a=ss, --define, b=yy
main_options: $VAR1 = {
'verbose' => 1,
'define' => {
'a' => 'ss',
'b' => 'yy'
},
'main-vi' => 1
};
p1 options: $VAR1 = {
'p1-v1' => 'k1',
'p1-v2' => 42
};
p2 options: $VAR1 = {
'p2-v1' => 'k2',
'p2-v2' => 66
};