【问题标题】:How to write cross-platform perl code如何编写跨平台的perl代码
【发布时间】:2011-09-12 13:42:23
【问题描述】:

一个包含适用于 Windows 和 Linux 的不同模块的 perl 脚本,为了使其跨平台,我想以某种方式实现它,就像在 C++ 中一样:

#if _WIN32
//...
#else
//...
#endif

【问题讨论】:

  • @Alex 我不认为它有效:使用 Win32::Console::ANSI if($^O eq 'MSWin32');
  • 通过use 加载模块是在编译时完成的。但是,您可以使用 Module::Load (search.cpan.org/~bingos/Module-Load-0.20/lib/Module/Load.pm),然后按照if($^O eq 'MSWin32'){load 'Win32::Console::ANSI'}else{#do something else...or not...whatever} 的方式说一些话
  • 请注意:记得使用File::Spec catfile() 和 catdir() 以可移植的方式构建文件路径和路径。
  • @Marco De Lellis,我更喜欢Path::Class。它是 File::Spec 的包装器,解决了 File::Spec 的一些问题。请注意,Windows 确实支持“/”作为目录分隔符(本机!),因此通常可以不使用 File::Spec 或 Path::Class。

标签: perl cross-platform


【解决方案1】:

if$^O

use if $^O eq 'MSWin32', Win32::Console::ANSI::;

或者,

use Win32::Console::ANSI ();

等价于

BEGIN {
    require Win32::Console::ANSI;
}

所以你也可以使用

BEGIN {
    require Win32::Console::ANSI
        if $^O eq 'MSWin32';
}

【讨论】:

  • 无法使用$^O 链接。它是 http://perldoc.perl.org/perlvar.html#$^O(减去空格)
  • 我可以。 :-) 尝试链接到English 名称。
  • @DVK, use Win32::Console::ANSI (); 总是等价于BEGIN { require Win32::Console::ANSI; }。它不会调用import,即使它确实存在。
  • @DVK,如果我说的是use Win32::Console::ANSI;,那就不一样了。顺便说一句,即使import 不存在,Module->import 也不会抛出错误。
猜你喜欢
  • 2016-03-10
  • 2020-06-22
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多