如何在Windows上运行Perl脚本时才能包含Win32模块?

1 windows perl cross-platform

我有一个问题,我似乎无法找到答案.

使用Perl我需要在Windows和unix平台上使用脚本.问题是在Windows上我们使用Win32特有的模块,如Win32 :: Process,并且这些模块在unix上不存在.

我需要一种方法只在Windows上包含这些Win32模块.

if($^O =~ /win/i)
{
    use win32::process qw(CREATE_NEW_CONSOLE);
}
else
{
    #unix fork
}
Run Code Online (Sandbox Code Playgroud)

问题在于使用windows语句.无论我尝试什么,这都不能在unix上编译.

我尝试过使用动态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";
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助!

dao*_*oad 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
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅perldoc以供使用.

另请参见perlvar$^O.


更新:

正如Sinan Unur指出的那样,最好避免使用间接对象​​语法.

我在每种情况下都使用直接方法调用,除了调用import.可能是因为import伪装成内置的.因为import它实际上是一个类方法,所以它应该被称为类方法.

谢谢,思南.

此外,在Win32系统上,您需要非常小心,以使您的模块名称大写正确.大写不正确意味着将无法正确导入符号.它可能变得丑陋.use win32::process似乎工作正常.

  • 避免使用间接对象语法:Win32 :: Process-> import(qw(CREATE_NEW_CONSOLE)); (4认同)