2013-07-03 3 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

Вы хотите _require_ потоков в блоке BEGIN, если $ Config {useithreads}, а не _use_ it. – pilcrow

+0

показать, что «задыхается» выглядит как – ysth

ответ

3

Когда потоки загружены, Perl знает, что threads::all (и друзья) является вызовом подпрограммы, даже без скобок или &; так как потоки не могут быть загружены, просто явным образом назову его круглыми скобками: threads::all()

+0

Спасибо, это сработало отлично! – worr

2

use Операторы анализируются во время компиляции. Вы хотите использовать require или Module::Load для вытягивания модулей условно во время выполнения.

Что-то, как это должно работать:

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

или просто 'use if $ Config {'useithreads'}, 'threads';' – ysth

+0

Я принял предложение @ ysth и использовал его, если, однако, компиляция на не-threaded машинах все еще терпит неудачу, если он ищет темы: все, потоки :: запущенные и т. д. символы. – worr

+1

не работает * как *? покажите нам, что происходит! покажите нам код, который использует threads :: all и т. д. – ysth

Смежные вопросы