2013-07-03 49 views
3

我有一個perl腳本,我已經開發了在具有不同版本的perl的主機上運行,​​有時使用線程編譯,有時沒有。如何在perl腳本中有條件地使用線程?

我有一個

use if $Config{"useithreads"}, "threads"; 

而且我所有的特定線程的代碼是在類似條件語句。

然而,在編譯階段,perl的還是扼流圈線程::所有,線程運行::等

我如何不確定我的腳本在兩個線程和非線程運行,皮爾斯?

[ worr on worr-mn1 ] (manage_usr_local_admin) % perl -c acct_mgr_ng.pl 
Bareword "threads::joinable" not allowed while "strict subs" in use at acct_mgr_ng.pl line 117. 
BEGIN not safe after errors--compilation aborted at acct_mgr_ng.pl line 541. 
+2

如果$ BIGIN塊需要_require_線程,如果$ Config {useithreads},而不是_use_ it。 – pilcrow

+0

顯示什麼「扼流圈」看起來像 – ysth

回答

3

當線程加載,PERL知道threads::all(朋友)是一個子程序調用,即使沒有括號或&;因爲線程可能沒有加載,所以明確地用括號括起來:threads::all()

+0

謝謝,這工作完美! – worr

2

use語句在編譯時被解析。您希望使用requireModule::Load在運行時有條件地引入模塊。

像這樣的東西應該工作:

use Module::Load(); 
if($Config{'useithreads'}) { 
    Module::Load::load("threads"); 
} 
+1

或只是'使用如果$配置{'usethreads'},'線程';' – ysth

+0

我採取了@ ysth的建議,並做了一個使用,如果,但編譯的非線程機器仍然失敗時它正在尋找threads :: all,threads :: running等符號。 – worr

+1

失敗* how *?告訴我們會發生什麼!向我們展示使用threads :: all等的代碼 – ysth