我有一个问题,我似乎无法找到答案.
使用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)
感谢大家的帮助!
担
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似乎工作正常.