2011-04-05 2 views
0

모든 헤더에서 이러한 선언을 반복하지 않고 모든 주요 선언을 주 Perl 프로그램 및 기타 패키지에 전용 패키지로 설정하고 싶습니다. 나는 확실히 그것을 오해하지만 뒤에 유리수를 알아낼 수 :전용 패키지의 perl 상수 정의

는 이제 가정 해 봅시다 :
- 나는 패키지 my_common_declarations.pm 내 내 공통 데이터 설정을 가지고있다.
-이 데이터를 다른 패키지 (예 : , my_perl_utils.pm)에서 사용하고 싶습니다.

#!/usr/bin/perl -w 
package my_perl_utils; 
use parent qw(Exporter); 
our @EXPORT_OK = qw(f1 f2); 
use my_common_declarations qw(debugme); 
my %setup = &debugme; 
my $DEBUGME = $setup{setup}{debugme}; 

# This generates this error : "Use of uninitialized value" 
use constant true => $setup{setup}{'true'}; 
print "=" x25, "\nDEBUG true :\nimport = " . $setup{setup}{'true'} . "\nconstant = " , true , "\n", "=" x25, "\n"; 

sub f1{ 
# some rationals using the true or false constants 
} 

sub f2{ 
} 

1; 

오류없이 선언 된 '참'상수를 가져 오는 데 성공할 수 없습니다.

공용 선언 패키지를 주 프로그램에서 한 번만 가져오고 여기에 상수를 선언하거나이 상수가 필요한 각 패키지 내에서 다시 선언해야합니까?

들으

답변

6

당신이로 실행하는 문제 런타임 및 스크립트에 컴파일 시간 사이의 상호 작용이다. use 선언은 암시 적으로 BEGIN {...} 블록을 포함하고 있습니다. 즉, 컴파일시에 발생합니다. %setup에 대한 할당은 상수가 선언 된 후 런타임에 발생합니다. 이 문제를 해결하려면 변수를 선언 한 다음 BEGIN 블록에 할당을 수행해야합니다. 그 방법은, 변수가 시간 use constant ...에 의해 정의됩니다 호출됩니다 :

use my_common_declarations 'debugme'; 

my (%setup, $DEBUGME); # declare variables with file scope 

BEGIN { 
    %setup = debugme;    # assign to variables at compile time 
    $DEBUGME = $setup{setup}{debugme}; 
} 

use constant true => $setup{setup}{true}; # %setup is defined now 

또는 당신이 해시를 반환하는 함수를 수출하고 있기 때문에, 왜,이 해시 참조를 반환하지 다음 코드를 작성할 수 로 : debugme 이후이 경우

use my_common_declarations 'debugme'; 

use constant true => debugme->{setup}{true}; 

는, 컴파일시에 첫 use 문으로 가져, 그것은 use constant ... 라인에서 사용할 수 있습니다.

일반적인 선언을위한 패키지를 선언 했으므로 상수의 정의를 해당 패키지로 옮긴 다음 true과 같은 항목을 해당 패키지의 내보내기 목록에 추가하는 것이 가장 좋은 이유는 무엇입니까?

+0

thx 여러분의 의견을 신중히 검토하고 구현하려고합니다. – hornetbzz

+1

하지만 그는 패키지 이름에 밑줄을 사용하고 있습니다. 즉, 로컬 사용을 위해 예약되어 있음을 의미합니다. [이 질문] (http://stackoverflow.com/questions/658955/how-do-i-choose-a-package-name-for-a-custom-perl-module-that-does-not-collide)을 참조하십시오. 자세한 내용은 – cjm

+0

@cjm => 그 점을 지적 해 주셔서 고맙습니다. 나는 그 대답을 삭제했습니다. –