仅当我';我在Windows上运行Perl脚本?

仅当我';我在Windows上运行Perl脚本?,windows,perl,cross-platform,Windows,Perl,Cross Platform,我有一个似乎找不到答案的问题 对于Perl,我需要跨Windows和unix平台使用脚本。问题是,在Windows上,我们使用Win32特定的模块,如,而这些模块在unix上不存在 我需要一种只在Windows上包含那些Win32模块的方法 if($^O =~ /win/i) { use win32::process qw(CREATE_NEW_CONSOLE); } else { #unix fork } 问题在于windows的use语句。无论我尝试什么,它都不会在unix

我有一个似乎找不到答案的问题

对于Perl,我需要跨Windows和unix平台使用脚本。问题是,在Windows上,我们使用Win32特定的模块,如,而这些模块在unix上不存在

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

if($^O =~ /win/i)
{
    use win32::process qw(CREATE_NEW_CONSOLE);
}
else
{
    #unix fork
}
问题在于windows的use语句。无论我尝试什么,它都不会在unix上编译

我尝试过使用动态evals、requires、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";
谢谢大家的帮助


Dan

您确定可以在OSX上加载win32::process吗?“darwin”与您的/win/i匹配。
你可能想用它来做正确的事情


除此之外,您是否可以发布一个示例,说明您实际使用的代码、收到的故障消息以及在哪个unix平台上(uname-a)?

您确定可以在OSX上加载win32::process吗?“darwin”与您的/win/i匹配。
你可能想用它来做正确的事情


除此之外,您是否可以发布一个示例,说明您实际使用的代码、接收到的故障消息以及在哪个unix平台上(uname-a)?

那么在每个操作系统上修改文件的解析器呢

您可以通过在两个操作系统上都工作的配置脚本来解析perl文件,以输出带有正确Use子句的perl。您甚至可以将解析操作隐藏在可执行脚本中以启动代码


起初,我认为C中的预编译器指令可以实现这一目的,但我对perl不太了解。

那么在每个操作系统上修改文件的解析器呢

您可以通过在两个操作系统上都工作的配置脚本来解析perl文件,以输出带有正确Use子句的perl。您甚至可以将解析操作隐藏在可执行脚本中以启动代码


起初我认为C中的预编译器指令可以做到这一点,但我对perl不太了解。

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
    }
}

另请参见
$^O
上的


更新:

正如西南联合国大学指出的那样,最好避免

我在任何情况下都使用直接方法调用,除了调用
import
。可能是因为
import
伪装成内置的。由于
import
实际上是一个类方法,因此应该将其作为类方法调用

谢谢,思南


此外,在Win32系统上,您需要非常小心,确保模块名称的大小写正确。不正确的大写表示符号无法正确导入。它可能会变得丑陋。
使用win32::process
可能看起来工作正常。

使用
在编译时执行

相反,你应该:

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
    }
}

另请参见
$^O
上的


更新:

正如西南联合国大学指出的那样,最好避免

我在任何情况下都使用直接方法调用,除了调用
import
。可能是因为
import
伪装成内置的。由于
import
实际上是一个类方法,因此应该将其作为类方法调用

谢谢,思南


此外,在Win32系统上,您需要非常小心,确保模块名称的大小写正确。不正确的大写表示符号无法正确导入。它可能会变得丑陋。
使用win32::process
可能看起来工作正常。

以下是第二组问题的答案:

您是否使用了
严格
警告

您是否定义了
ErrorReport()
子例程
ErrorReport()
只是本课程大纲中的一个示例

CREATE\u NEW\u控制台
可能不是数字,因为它没有正确导入。检查调用
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

以下是对第二组问题的回答:

您是否使用了
严格
警告

您是否定义了
ErrorReport()
子例程
ErrorReport()
只是本课程大纲中的一个示例

CREATE\u NEW\u控制台
可能不是数字,因为它没有正确导入。检查调用
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

您可以将特定于平台的代码放在
eval{}
中,然后检查是否有错误

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

    # Unix code here

  }
}

您可以将特定于平台的代码放在
eval{}
中,然后检查是否有错误

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

    # Unix code here

  }
}

避免使用间接对象语法:Win32::Process->import(qw(创建新控制台));避免使用间接对象语法:Win32::Process->import(qw(创建新控制台));