2011-11-29 76 views
2

我編寫了這段代碼,它在系統中安裝了POE模塊時起作用。eval和使用問題

#!/usr/bin/perl 

use strict; 
use warnings; 
use POE; 

... 

但我想,以確定是否該模塊有:

#!/usr/bin/perl 

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

... 

,並返回:

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常量在編譯時被檢查。所以,你需要把你的eval內一個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