2013-01-07 4 views
2

짧은 버전

IT는 BEGIN 코드 블록 내에서 규정되지 않은 이름을 사용 our로 선언 된 모듈에서 변수에 액세스 할 수 있지만 외부 규정 된 이름을 사용하고 계십니까? 특히 을 모듈 파일에서 명시 적으로 패키지 이름을 지정하지 않고없이 수행 할 수 있습니까?패키지 이름

demomod.pm

use strict; 
use warnings;  
package demomod; 
our $foo; 
BEGIN { $foo = 42; } 
1; 

demoscript.pl이 경우

#!/usr/bin/perl -Tw 
use strict; 
use warnings; 
BEGIN { @INC = ('.', @INC); } 
use demomod; 
print $demomod::foo."\n"; 

, 모든 이름이 동의 할하자, 모든 것이 예상대로 작동합니다. demomod.pm 코드에서 package demomod; 줄을 생략하고 여전히이 방법을 사용할 수 있습니까? 내가 Foswiki의 최근 업그레이드하는 동안이 라인을 따라 뭔가가 발생했기 때문에

동기 부여

내가 부탁 해요 이유입니다. 그 소프트웨어는 Foswiki.pmpackage 라인이 없습니다(EDIT : package 라인은 내 로컬 복사본에서 분실 된 것 같습니다) 모듈이 있습니다. 이 declaresinitializes 변수는 $engine입니다. CGI 스크립트 view@INC을 설정하고 use Foswiki(); 다음에 $Foswiki::engine->run()을 입력합니다. 모듈의 BEGIN 블록에서

Can't call method "run" on an undefined value at …/view 

$engine이 올바르게 설정되어 있지만 $Foswiki::engine 분명히되지 않습니다 :이 마지막 줄은 항상 인해 초기화되지 않은 변수에 나를 위해 실패합니다. 여기에 두 개의 변수가있는 것처럼 보입니다. 하나는 자격이 있고 다른 하나는 자격이없는 것입니다.

이 코드는 분명히 다른 사람들에게도 잘 작동하며, 이전 버전 인 package이없고입니다. 그래서 내가 어떻게 깨 졌는지 이해하려고 노력하는 동안, 나는 또한 그 선이 자리 잡기 전에 이것이 어떻게 작동 할 수 있는지 이해하려고 노력합니다. 이 작업을 수행 할 수있는 메커니즘이 있습니까?

답변

3

코드에 package 문이없는 경우 패키지 변수는 main 패키지로 선언됩니다. 그래서 아니오, 당신은 당신이 묘사하는 것을 할 수 없습니다.

연결된 코드 Foswiki의 2 번째 줄을 보면 에 패키지 문이 있음을 알 수 있습니다.

+0

OK, 당신은 해당 라인이 업스트림 소스에 존재한다는 것입니다. 나는 잘못해서 내 로컬 사본이 동일하다고 생각했다. 아직도 그 줄이 내 사본에 들어간 곳을 알아 내려고 노력했다. 이상하지만 분명히 지역 문제. – MvG