2009-05-21 3 views
1

나는 답을 찾을 수 없다는 문제가 있습니다.Windows에서 Perl 스크립트를 실행하는 경우에만 Win32 모듈을 포함 할 수 있습니까?

Perl에서는 Windows 및 UNIX 플랫폼에서 스크립트를 사용해야합니다. 문제는 Windows에서 Win32::Process과 같은 Win32-specific 모듈을 사용하고 있으며 해당 모듈이 유닉스에 존재하지 않는다는 것입니다.

Windows에만 해당 Win32 모듈을 포함시키는 방법이 필요합니다.

문제는 Windows 용 문을 사용하는 것입니다. 아무리 노력해도 유닉스에서 컴파일되지 않는다.

내가 동적 evals를 사용하여 시도

,

이 문제에 대한 좋은 해결책이 있는가 등, BEGIN이 필요합니다? 어떤 도움이라도 대단히 감사하겠습니다. 사전에

감사합니다,


업데이트 :

동료 나이 지적

그것을 할 올바른 방법입니다.

require Win32; 
require Win32::Process; 

my $flag = Win32::Process::CREATE_NEW_CONSOLE(); 

Win32::Process::Create($process, 
    $program, 
    $cmd, 
    0, 
    $flag, ".") || die ErrorReport(); 

print "Child started, pid = " . getPID() . "\n"; 

감사합니다.

답변

7

use은 컴파일 타임에 실행됩니다.

대신 수행

BEGIN { 
    if($^O eq 'MSWin32') { 
     require Win32::Process; 
     # import Win32::Process qw(CREATE_NEW_CONSOLE); 
     Win32::Process->import(qw/ CREATE_NEW_CONSOLE /); 
    } 
    else { 
     #unix fork 
    } 
} 

perldoc for use를 참조하십시오.

perlvar ($^O)도 참조하십시오.


업데이트 :

신안 Unur가 지적 하듯이, 그것은 indirect object syntax를 방지하는 것이 가장 좋습니다.

import을 제외한 모든 경우에 직접 메서드 호출을 사용합니다. 아마 import이 내장 된 것으로 가장하기 때문일 것입니다. import은 실제로 클래스 메서드이므로 클래스 메서드로 호출해야합니다.

감사합니다.

또한 Win32 시스템에서는 모듈 이름의 대소 문자를 올바르게 처리해야합니다. 대문자가 잘못 사용되면 기호를 올바르게 가져올 수 없습니다. 그것은 추한 얻을 수 있습니다. use win32::process이 정상적으로 작동하는 것처럼 보일 수 있습니다.

당신이 strictwarnings를 사용하고 있습니까 :

+4

간접 개체 구문을 피하십시오. Win32 :: Process-> import (qw (CREATE_NEW_CONSOLE)); –

3

OSX에서 win32 :: process를로드 할 수 있습니까? "다윈"은/win/i와 일치합니다.
http://search.cpan.org/dist/Sys-Info-Base/을 올바르게 사용하려고 할 수 있습니다.

그렇다면 실제로 사용하고있는 코드,받은 오류 메시지 및 유닉스 플랫폼 (uname -a)의 예를 게시 할 수 있습니까?

0

각 OS에서 파일을 수정하는 파서는 어떻게됩니까?

두 운영 체제에서 작동하는 configure 스크립트를 통해 perl 파일을 구문 분석하면 적절한 Use 절을 ​​사용하여 perl을 출력 할 수 있습니다. 실행 가능한 스크립트에 파싱 동작을 묻어 코드를 실행할 수도 있습니다.

원래 C의 프리 컴파일러 지시문이 트릭을 수행 할 것이라고 생각했지만 펄은 잘 모릅니다.

0

여기에 질문의 두 번째 세트에 대한 답변입니까?

ErrorReport() 서브 루틴을 정의 했습니까? ErrorReport()Win32::Process의 개요에 나와 있습니다.

CREATE_NEW_CONSOLE은 제대로 가져 오지 않았기 때문에 아마 숫자가 아닙니다. 전화의 자본금을 import으로 확인하십시오.

다음 한 라이너 비교 :

C:\>perl -Mwin32::process -e "print 'CNC: '. CREATE_NEW_CONSOLE; 
CNC: CREATE_NEW_CONSOLE 

C:\>perl -Mwin32::process -Mstrict -e "print 'CNC: '. CREATE_NEW_CONSOLE; 
Bareword "CREATE_NEW_CONSOLE" not allowed while "strict subs" in use at -e line 1. 
Execution of -e aborted due to compilation errors. 

C:\>perl -MWin32::Process -e "print 'CNC: '. CREATE_NEW _CONSOLE; 
CNC: 16 
0

당신은 단지 eval{}의 내부 플랫폼 특정 코드를 삽입하고, 오류를 확인 할 수있다.

BEGIN{ 
    eval{ 
    require Win32::Process; 
    Win32::Process->import(qw'CREATE_NEW_CONSOLE'); 
    }; 
    if([email protected]){ # [email protected] is $EVAL_ERROR 

    # Unix code here 

    } 
} 
관련 문제