仅当我';我在Windows上运行Perl脚本?
我有一个似乎找不到答案的问题 对于Perl,我需要跨Windows和unix平台使用脚本。问题是,在Windows上,我们使用Win32特定的模块,如,而这些模块在unix上不存在 我需要一种只在Windows上包含那些Win32模块的方法仅当我';我在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
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(创建新控制台));