2010-05-26 4 views
9

패키지 심볼을 네임 스페이스로 내보내는 방법을 이해하는 데 문제가 있습니다. 나는 문서를 거의 동일하게 따라 갔지만 수출 기호에 대해서는 알지 못합니다.패키지 기호를 Perl의 네임 스페이스로 내보내려면 어떻게해야합니까?

mod.pm

#!/usr/bin/perl 

package mod; 

use strict; 
use warnings; 

require Exporter; 

@ISA = qw(Exporter); 
@EXPORT=qw($a); 


our $a=(1); 

1; 

test.pl는

$ cat test.pl 
#!/usr/bin/perl 

use mod; 

print($a); 

이것은

$ ./test.pl 
Global symbol "@ISA" requires explicit package name at mod.pm line 10. 
Global symbol "@EXPORT" requires explicit package name at mod.pm line 11. 
Compilation failed in require at ./test.pl line 3. 
BEGIN failed--compilation aborted at ./test.pl line 3. 

$ perl -version 
This is perl, v5.8.4 built for sun4-solaris-64int 
+1

아주 오래된 Perl. 가능한 경우 업그레이드하십시오. – tsee

+1

레거시 시스템, 난 그걸로 붙어있어 – Mike

+1

아래 답변의 짧은 버전은 이미 TFM에서 설명되어 있습니다 : http://p3rl.org/Exporter#Good_Practices – daxim

답변

17

$a을 내 보내는데 문제가 있음을 알려주지 않습니다. @ISA@EXPORT으로 신고하는 중입니다. @ISA@EXPORT은 패키지 변수이며 strict 아래에 our 키워드로 선언하거나 (다른 모듈에서 가져온 것이지만 두 모듈에서는 그렇지 않을 수 있습니다). 그들은 의미 상으로 다르지만 기능적으로 다른 것은 아닙니다 - $a.

보모 참고 :@EXPORT은 공손한 것으로 간주되지 않습니다. Exporter을 통해 기호를 사용 패키지에 덤프합니다. 기회가 있다면 뭔가를 수출하는 것이 좋다고 생각하면 입니다. 그러면 사용자가 요청할만한 가치가 있습니다. 대신 @EXPORT_OK을 사용하십시오.

14

이 시도 실행의 결과입니다

package mod;    # Package name same as module. 

use strict; 
use warnings; 

use base qw(Exporter); 

our @ISA = qw(Exporter); # Use our. 
our @EXPORT = qw($z);  # Use our. Also $a is a bad variable name 
          # because of its special role for sort(). 

our $z = 1; 

1; 
6

다른 사람들은 문제를 정확히 확인하고 해결책을 제시했습니다. 디버깅 팁을 지적하는 것이 유용 할 거라고 생각했습니다. 주어진 파일에 문제를 격리하려면 perl -c를 사용하여 그냥 파일을 컴파일을 시도 할 수 있습니다 (perlrun 참조) :

perl -c mod.pm 

이 문제에 실현을 선도하는 당신에게 같은 오류 메시지를 준 것 파일 .pl이 아니라 파일 .pm.

관련 문제