2015-01-06 4 views
1

Perl에서 명령 줄 인수를 사용하여 전역 변수를 초기화해야합니다.이 전역 변수는 패키지 집합에 전달되어 해당 패키지의 변수 값을 설정합니다. 주 프로그램이 main.pl에 인수 $ opt_n이 있고 패키지가 a.pm, b.pm 및 c.pm이라고 가정하면 어떻게 할 수 있습니까?perl 패키지 변수가 명령 줄을 통해 설정되었습니다.

도와주세요.

+0

당신은 무엇을 고려 했습니까/시도 했습니까? – DVK

답변

2

:


또 다른 대안은 직접의 주요 값에 액세스하는 것입니다. 첫 번째 단계는 명령 줄 인수를 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)을 사용하는 것과 매우 다릅니다.

+0

$ package_var = $ global_var와 같은 각 패키지에 표현식을 작성하고 global_var 만 설정할 수 있습니까? 그 패키지 함수는 호출 될 필요가 없다. – bvnbhati

+0

예, 'my $ opt_n = $ :: opt_n;'이라고 쓸 수 있습니다. 이내에.pm하지만,이 코드가 $ :: opt_n이 main.pl 내에서 설정된 후에 실행되어야합니다. 어쩌면 A.pm에서 'my $ opt_n'이 필요 없으며이 패키지 내에서 $ :: opt_n을 참조 할 수 있습니까? –

2

간단한 솔루션 :

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); 
+0

"로드 된 패키지 목록을 기반으로 자동 setter 호출"에 대한 대답을 자세히 설명해 주실 수 있습니까? – bvnbhati

+0

@bvnbhati - 메인 변수에 액세스 할 수있는 두 번째 솔루션을 추가했습니다. 로드 된 모든 모듈에 대해 setter를 호출하는 방법을 알고 싶다면 별도의 질문으로 문의하십시오. – DVK

관련 문제