짧은 버전
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.pm
(EDIT : package
라인이 없습니다package
라인은 내 로컬 복사본에서 분실 된 것 같습니다) 모듈이 있습니다. 이 declares 및 initializes 변수는 $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
이없고
OK, 당신은 해당 라인이 업스트림 소스에 존재한다는 것입니다. 나는 잘못해서 내 로컬 사본이 동일하다고 생각했다. 아직도 그 줄이 내 사본에 들어간 곳을 알아 내려고 노력했다. 이상하지만 분명히 지역 문제. – MvG