【问题标题】:Perl platform based modules基于 Perl 平台的模块
【发布时间】:2014-02-19 01:42:25
【问题描述】:

我想编写模块,如果你从 Windows 加载,它将加载 MSWin32 模块,而从 linux 它将加载 linux 模块。子程序的实现会因平台而异。
例如


package Common::Copy::MSWin32;
sub do_this {}

package Common::Copy::linux;
sub do_this {}


#!/bin/perl
use lib Common::Copy::$^O;

do_this();

如何实现?

【问题讨论】:

标签: perl


【解决方案1】:

执行此操作的标准方法是检查变量$^O$OSNAME 启用English pragma)。它反映了构建 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';

【讨论】:

  • @Kamikaze:您对我的回答的编辑已被拒绝。你必须说的是有效的,但它属于评论。你不应该修改别人的答案,除非是为了改进或更正他们
【解决方案2】:

您可以像 File::Spec 那样加载 same way 的模块。

(假设 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();

这需要将子例程编写为可能不是您想要的方法。


看起来您实际上希望 exportsimilar 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();

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 2014-08-11
    • 1970-01-01
    • 2021-12-27
    • 2018-06-25
    • 2011-08-23
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多