我想编写模块,如果你从windows加载,它将加载MSWin32模块,从linux它将加载Linux模块。子程序的实现将根据平台的不同而不同。
e.g。
package Common::Copy::MSWin32;
sub do_this {}
package Common::Copy::linux;
sub do_this {}
#!/bin/perl
use lib Common::Copy::$^O;
do_this();
如何实现?
答案 0 :(得分:3)
执行此操作的标准方法是检查变量$^O
($OSNAME
并启用English
编译指示)。它反映了构建perl可执行文件时指定的操作系统,它可以采用的值列在perldoc perlport
中。对于任何 Windows系统,它将是MSWin32
。
如果您需要区分Windows的不同版本,那么您可以使用Win32
模块,该模块提供Win32::GetOSVersion
功能,可以准确地告诉您正在使用的Windows系统和补丁程序级别。
要根据$^O
的值包含不同的模块,您应该使用if
pragma,就像这样
use if $^O eq 'MSWin32', 'Common::Copy::MSWin32';
use if $^O ne 'MSWin32', 'Common::Copy::Linux';
答案 1 :(得分:0)
您可以加载same way所做的File::Spec模块。
(假设use warnings;
,use strict;
和版本声明紧跟在此帖子中的所有package
声明之后)
package Common::Copy::Win32;
sub do_this {}
package Common::Copy::Linux;
sub do_this {}
package Common::Copy;
my %module = (
MSWin32 => 'Win32',
linux => 'Linux',
);
my $module = $module{$^O} || 'Linux';
require "Common/Copy/$module.pm";
our @ISA = ("Common::Copy::$module");
#!/bin/perl
use Common::Copy;
Common::Copy->do_this();
这将要求子程序被编写为可能不是您想要的方法。
看起来你实际上想要export中的similar way与File::Spec::Functions的方式相同。
此实现假定子例程不是作为方法编写的。
package Common::Copy;
require Exporter;
our @ISA = qw'Exporter'; # use Exporters `import` method
our @EXPORT = qw'do_this';
our @EXPORT_OK = qw'';
our %EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] );
my %module = (
MSWin32 => 'Win32',
linux => 'Linux',
);
our $module = $module{$^O} || 'Linux';
require "Common/Copy/$module.pm";
$module = "Common::Copy::$module"; # full name of actual module
foreach my $subname (@EXPORT, @EXPORT_OK) {
my $subref = $module->can($meth); # misuses method lookup
no strict 'refs';
# import the subroutines into this namespace
# assumes they aren't written as methods
*{$subname} = \&$subref;
}
#!/bin/perl
use Common::Copy;
# use Common::Copy qw':all';
# use Common::Copy qw'do_this';
do_this();