2017-10-19 9 views
3

필자가 작업중인 Perl 프로그램에서 사용자는 몇 가지 변수 (변수 번호)를 정의 할 것으로 예상되는로드 할 Perl 모듈을 지정할 수 있습니다. Perl 프로그램은 기본적으로이 값을 모두 네임 스페이스에 넣는 것을 제외하고 패키지를 일반 해시로 처리하여 이러한 변수를 처리합니다. 이렇게하면 잘 작동, 즉이 프로그램을 인쇄 '2':패키지가 정의 된 시점에 패키지의 심볼을 가져 오는 방법은 무엇입니까?

use strict; 
use warnings; 

package P { 
    my $k1 = 'v1'; 
    my $k2 = 'v2'; 
}; 

my $n = scalar keys %P::; 
print "Number of entries: $n\n"; 
# print $P::x; 

그러나, 마지막 줄의 주석을 해제하는 프로그램 인쇄하게 '3'. 나는. 패키지의 변수에 대한 언급은 심볼 테이블에 변수를 추가하는 것처럼 보입니다.

기호 표가 정의 된대로 패키지의 기호 표를 가져 오는 방법이 있습니까? 예를 들어 기호 표가 두 항목으로 구성되어 있습니까?

+3

아마도 실행 시간에 다른 패키지 변수를 정의하지만, 당신이 그렇게 할 왜 아마도 더 중요한 질문은하는 , 거기에 더 좋은 방법이 있습니다. –

+4

이것은 [XY 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 매우 흡사합니다. 당신이 성취하고자하는 것과 그 이유를 되풀이하는 것이 현명 할 것입니다. 또한 '엄격한'및 '경고'를 켜십시오. – Sobrique

+0

@ Сухой27 필자는 Perl 모듈로 저장된 '구성'을로드 할 수있는 대화식 Perl 디버거 (부분적으로 Perl 자체, 부분적으로 C++로 작성 됨)를 작업 중입니다. 구성은 기본적으로 키 - 값 쌍의 집합입니다. 구성 키는 네임 스페이스 (즉, 일반 해시에 저장되는 것이 아니라 해시처럼 처리되는 패키지)에 있어야합니다. 디스크의 설정이 변경되었는지 또는 어떤 설정을 쓸 것인지 결정할 때 등 다양한 용도로 디스크 _에 저장된 전체 설정 세트가 프로그램에 필요합니다. –

답변

5

컴파일시에 발견 된 패키지 변수는 컴파일시에 숨김에 추가됩니다. 그래서 해결 방법은 컴파일 단계에서 숨김을 평가입니다

package P { 
    $k1 = 'v1'; 
    $k2 = 'v2'; 
}; 

BEGIN {  
    my $n = scalar keys %P::; 
    print "Number of entries: $n\n"; # 2 
} 
print $P::x; 

또는

package P { 
    $k1 = 'v1'; 
    $k2 = 'v2'; 
}; 

my $n = scalar keys %P::; 
print "Number of entries: $n\n"; # 2 
print eval '$P::x'; 
$n = scalar keys %P::; 
print "Number of entries: $n\n"; # now 3 
+0

아, 고마워요. - 제가 메인 모듈에서'BEGIN'을 사용할 수 있다고 생각하지 않았습니다. - 도움이되었습니다! –