基于Perl平台的模块

时间:2014-02-14 23:27:59

标签: perl

我想编写模块,如果你从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();

如何实现?

2 个答案:

答案 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 wayFile::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();