2010-02-01 4 views
9

두 가지 버전의 Perl 모듈이 있습니다. 현재 중요한 스크립트는 환경 변수에 지정된 모듈 버전을 사용하며 시스템은 다른 사용자가 실행하는 다른 작업에 의존합니다. 사용자 환경에 따라 사용 된 Perl 모듈의 버전이 결정됩니다.어떻게 Perl 모듈 경로를 동적으로 변경합니까?

이제 이것을 전달 된 옵션에 따라 Perl 스크립트 내에서 지정된 버전으로 변경하고 싶습니다. 죄송합니다. 코드는 다음과 같습니다.

if ($new){ use lib "newdir"; } 
else{ use lib "olddir"; } 
use module; 

이 작동하지 않습니다. Perl은 단순히 newdir을 추가 한 다음 olddir to @INC을 추가 한 다음 스크립트를 실행합니다.

사용할 모듈을 어떻게 동적으로 지정합니까? 당신이하지 않았을 있도록 또한 PERL5LIB 환경 변수를 설정할 수 있습니다

BEGIN { 
    if ($new) { unshift @INC, "newdir"; } 
    else {  unshift @INC, "olddir"; } 
} 
use module; 

: else 코드를 컴파일 시간에 실행됩니다 -

답변

15

당신은 당신의 if가 있도록 BEGIN{} 블록을 사용할 필요가 이 종류의 구성을 스크립트에서 수행하십시오.

+0

* 별난 * 브라케팅 스타일로 인해 닫히지 않은 블록이 남았습니다. (이제, 깜짝 놀라는 전쟁을 시작하십시오!) – Axeman

+0

Eek. Axeman에게 감사드립니다. – mob

+1

또한 언급 할 가치가있는 것은 "lib 사용"과 @INC를 직접 조작하는 것이 항상 동등한 작업이 아니라는 것입니다. 자세한 내용은 문서를 참조하십시오. – jrockway

12

CPAN에는 onlypragma가있어 동일한 모듈의 여러 버전을 쉽게 설치하고 사용할 수 있습니다.

3

로직이 런타임에 발생하는 경우 (예 : $ new 변수가 BEGIN 블록에서 실행하고 싶지 않은 좀 더 복잡한 방법으로 생성 된 경우) require()를 사용하여 런타임에 모듈.

기억해야 할 중요한 것은

use Module; 
use ModuleWithExports qw(export1 export2); 

이것은 즉 당신이 할 수있는 런타임에 코드 실행을 의미

BEGIN { require Module; Module->import() } 
BEGIN { 
    require ModuleWithExports; 
    ModuleWithExports->import('export1', 'export2'); 
} 

과 동일 함을 단순히 있습니다

if ($new) { 
    unshift @INC, "newdir"; 
} 
else { 
    unshift @INC, "olddir"; 
} 
require module; 
module->import(); # if necessary 

require()를 사용하는 대신 CPAN의 Module::Load 모듈을 사용할 수 있습니다.

관련 문제