2011-11-29 5 views
2

이 코드를 작성했으며 POE 모듈이 시스템에 설치된 경우 작동합니다.평가 및 사용 관련 문제

#!/usr/bin/perl 

use strict; 
use warnings; 
eval("use POE; 1") or die ('Please, install POE module. \n'); 

... 

을 그리고 반환 :

#!/usr/bin/perl 

use strict; 
use warnings; 
use POE; 

... 

는하지만이 모듈이 존재하는지 확인하려면 내가 다른 모듈을 시도하고도 오류를했다

Bareword "KERNEL" not allowed while "strict subs" in use at ./terminalhero.perl line 58. 
Bareword "HEAP" not allowed while "strict subs" in use at ./terminalhero.perl line 60. 
Execution of ./terminalhero.perl aborted due to compilation errors. 

. 엄격 모드를 사용하여 내가 원하는 것을 어떻게 할 수 있습니까?

+1

'terminalhero.perl'의 내용은 무엇입니까? 특히 58 행과 60 행. – Trott

+0

코드를 다시 보내주십시오. 참조가 사라지면 SO가 쓸모 없게됩니다. – JGurtz

답변

8

문제는 컴파일 시간 후에 eval이 실행되지만 컴파일시에 KERNELHEAP 상수가 검사된다는 것입니다. 그래서 당신은 BEGIN 블록의 내부에 평가를 둘 필요가 :

BEGIN { 
    eval "use POE;"; 
    die "Unable to load POE: [email protected]\n" if [email protected]; 
} 

이 대부분 무용에있는 운동이지만,이 모듈을 '로드 할 수없는 경우 표준 use POE; 또한 유용한 오류로 죽을 것이기 때문에 요청했습니다.

+0

이 방법은 프로그램이 악의적 인 사전 예방적인 느낌이 들었다면 자동으로 다운로드하여 누락 된 모듈을 설치하도록 요청할 수 있습니다. 그러나 그것은 실제로 좋은 것보다 더 해를 끼칠 수 있습니다. –

+0

@JonPurdy : 예, 죽는 것 외에 다른 일을하고 있다면 감각이 있습니다. – Flimzy

+0

나는 표준 오류 메시지를 유용하다고 부르지 않을 것이다. 하나 [perl5i에서 제공] (http://p3rl.org/perl5i#Better-load-errors)와 비교하십시오. – daxim