2013-04-17 2 views
-1

, 아래의 파일은 아래 코드는혼란 내가 두 개의 파일이

package pack_module; 
use Exporter; 
@ISA = qw/Exporter/; 
@EXPORT = qw/$var/; 
our ($var); 
sub check_scope 
{ 
    $var = 3; 
} 
1; 

언제,

use pack_modules; 
$var = 1; 
print "var is $var\n"; 
&pack_module::check_scope($var); 
print "var is $var\n"; 

두 번째 파일은 "pack_modules.pm"이다, "Packages_module.pl"입니다 pack_modules.pm을 실행하면 다음과 같은 결과가 나타납니다. '$ var에'가 1이 될 것이라고

var is 1 
    ========== 
    Using Module Subroutine: 
    var is 1 
    ========== 

처음, 그것은 분명했지만, "pack_module"의 값이 표시되지 않는 이유를 다시 오히려 3보다 1을주고 있었다 두 번째는 하나 말해 줄 수 "Packages_module"에 있습니다.

+2

'$ var'가 아니라'$ var2'를 내 보내지 않았습니다. 가정을 테스트하기 위해'$ pack_module :: var'을 살펴볼 수도 있습니다. 'check_scope '의 인수는 무시됩니다. (아, 그리고 소문자 모듈을 쓰거나,'&'를 사용하여 서브를 호출하지 마십시오.) – amon

+0

@amon 실수로 $ var2 대신 $ var를주었습니다. 어쨌든 나는 그것을 편집했지만, 여전히 동일한 결과를 내고있다. 실수로 –

답변

1

주요 문제 :

당신은 $var을 수출하지 않는

하지만 $var2. $var을 내 보낸 경우 값이 변경됩니다.

또한 pack_moudles을 사용하지만 패키지의 이름은 pack_module입니다.

그러나 약간의 사소한 문제가 있습니다. 매개 변수와 함께 check_scope을 호출했지만 서브 루틴 본문에서 매개 변수를 검색하지 않습니다. 대신 글로벌 변수 $var의 값을 변경합니다.

+0

$ var2 대신 $ var를주었습니다. 어쨌든 나는 그것을 편집했지만, 여전히 동일한 결과를 내고있다. –

+0

'pack_module'은'pack_modules'와 다릅니다. – choroba

1

use pack_modulesrequire 단계는 잘 작동, pack_modules.pm라는 모듈 파일부터 BEGIN { require pack_modules; pack_modules->import; }

에 해당합니다.

그런 다음 파일에 pack_module 패키지가 포함되어 있기 때문에 아무 것도하지 않는 pack_modules->import을 호출합니다. 주 프로그램이 pack_modules ("s"포함)에서 기호를 가져 오는 경우 pack_module (최종 "s"없음) 내보내기가 중요하지 않습니다.

모듈 파일의 첫 번째 줄을 package pack_modules;으로 변경하고 주 프로그램의 서브 호출을 pack_modules::check_scope($var);으로 변경하면 제대로 작동합니다. (부수적으로, 사용자 정의 함수에 대한 접두사를 &으로 접두사로 붙이지 마십시오. Perl 4에서 포착 된 것이므로 Perl 5에서는 필요하지 않으며 부작용이있을 수 있습니다.

덧붙여서 use strict;으로 프로그램을 시작한 경우 주 프로그램에 Global symbol "$var" requires explicit package name이라는 불평을함으로써이 문제의 원인에 대한 추가 단서를 얻을 수 있습니다.