Perl에서 명령 줄 인수를 사용하여 전역 변수를 초기화해야합니다.이 전역 변수는 패키지 집합에 전달되어 해당 패키지의 변수 값을 설정합니다. 주 프로그램이 main.pl에 인수 $ opt_n이 있고 패키지가 a.pm, b.pm 및 c.pm이라고 가정하면 어떻게 할 수 있습니까?perl 패키지 변수가 명령 줄을 통해 설정되었습니다.
도와주세요.
Perl에서 명령 줄 인수를 사용하여 전역 변수를 초기화해야합니다.이 전역 변수는 패키지 집합에 전달되어 해당 패키지의 변수 값을 설정합니다. 주 프로그램이 main.pl에 인수 $ opt_n이 있고 패키지가 a.pm, b.pm 및 c.pm이라고 가정하면 어떻게 할 수 있습니까?perl 패키지 변수가 명령 줄을 통해 설정되었습니다.
도와주세요.
:
또 다른 대안은 직접의 주요 값에 액세스하는 것입니다. 첫 번째 단계는 명령 줄 인수를 main.pl 내의 변수로 가져 오는 것입니다. 명령 줄 인수는 사전 정의 된 펄 목록 변수 @ARGV를 통해 사용할 수 있습니다. 정확히 하나의 명령 행 인수가 있다고 가정하면, 다음 작동합니다 :
my $opt_n = $ARGV[0];
명령 행 인수의 정확한 수를 공급되었는지 여부를 확인하는 것이 좋습니다. 예 :
if (not @ARGV) {die "No command line arguments were supplied.\n";}
if (scalar(@ARGV) > 1) {die "Too many command line arguments were supplied.\n";}
my $opt_n = $ARGV[0];
여러 명령 줄 인수가 필요한 경우 shift 연산자를 사용하는 것이 편리합니다. 1) 대신 '내 $의 opt_n')의 $ opt_n 글로벌 ('우리의 $의 opt_n'을 만들거나 2) $ opt_n을 통과 :
my $opt_n = shift @ARGV;
my $opt_o = shift @ARGV;
if (not defined $opt_o) {die "Too few command line arguments.\n";}
다른 패키지 $ opt_n의 값을 사용하는 방법에는 두 가지가 있습니다 $ opt_n을 다른 패키지에 액세스 할 수있는 변수에 저장하는 다른 패키지의 서브 루틴에 이르기까지. 전역 변수 경로는 더 간단하지만보다 상호 의존적이며 복잡한 코드를 생성합니다. 이 작업을 원하면 다른 패키지에서 '$ :: opt_n'을 참조하십시오.
두 번째 방법을 사용하면 main.pl에서 A.pm 서브 루틴을 호출 할 수 있습니다.
A::set_opt_n($opt_n);
그리고 A.pm에서
,이 같은 작성합니다 set_opt_n 후package A;
use strict;
my $opt_n;
sub set_opt_n($)
{
my ($opt_n_from_main) = @_;
$opt_n = $opt_n_from_main;
return;
}
가 main.pl에서 호출을 $의 opt_n는 A.pm.에서 사용할 수 있습니다 물론 main.pl의 $ opt_n과 A.pm의 $ opt_n은 두 개의 다른 변수입니다. 하나의 값이 변경되면 다른 값은 자동으로 변경되지 않습니다. 이것은 하나의 전역 변수 $ :: opt_n (또는 $ main :: opt_n)을 사용하는 것과 매우 다릅니다.
$ package_var = $ global_var와 같은 각 패키지에 표현식을 작성하고 global_var 만 설정할 수 있습니까? 그 패키지 함수는 호출 될 필요가 없다. – bvnbhati
예, 'my $ opt_n = $ :: opt_n;'이라고 쓸 수 있습니다. 이내에.pm하지만,이 코드가 $ :: opt_n이 main.pl 내에서 설정된 후에 실행되어야합니다. 어쩌면 A.pm에서 'my $ opt_n'이 필요 없으며이 패키지 내에서 $ :: opt_n을 참조 할 수 있습니까? –
간단한 솔루션 :
package a;
our $global_for_a;
sub set_global_a { $global_for_a = shift; }
1;
#### Your main.pl
# Process GetOpt
a::set_global_a($opt_n);
는 애호가 가지가 있습니다 (예를 들면 자동으로로드 된 패키지의 목록을 기반으로 setter를 호출)하지만 펄의 내장을 알고있는 고급 사용자를위한이다 : 각 패키지에, 세터 메소드를 생성 . 당신의 목표를 달성하기 위해 여러 가지 방법이 있습니다
# Old code in a.pm
do_stuff($global_for_a);
# Instead, use Main's global:
do_stuff($main::opt_n);
당신은 무엇을 고려 했습니까/시도 했습니까? – DVK