如何在 Perl 中解决 Windows 和 Linux 客户端的“常量标志”?

Posted

技术标签:

【中文标题】如何在 Perl 中解决 Windows 和 Linux 客户端的“常量标志”?【英文标题】:How to resolve 'constant flags' for Windows and Linux clients in Perl? 【发布时间】:2011-12-07 18:29:30 【问题描述】:

我正在使用下面给出的 Linux 和 Windows perl 库 -

Linux:

use Fcntl; 
use File::FcntlLock

窗户:

use Win32::API;
use Win32API::File qw(:Func :Misc :FILE_:FILE_FLAG_ :FILE_SHARE_ :FILE_ATTRIBUTE_ :GENERIC_ )

所以基于我用来运行脚本的主机(Linux 或 Windows),我正在加载包-

my $linux_packages = "use Fcntl; use File::FcntlLock; use File::Copy;1;";
my $window_packages
    = "use Win32::API; use Win32API::File qw(:Func :Misc :FILE_ "
    . ":FILE_FLAG_ :FILE_SHARE_ :FILE_ATTRIBUTE_ :GENERIC_ );1;";

if ( $Hosttype =~ /unix/ ) 

    eval "$linux_packages";


 elsif ( $Hosttype =~ /windows/ ) 

    eval "$window_packages";

 

现在我正在尝试使用来自 Linux 或 Windows 客户端的标志,但如果我在 Linux 客户端上运行脚本,它会抛出 Windows 标志的错误

脚本错误:使用“strict subs”时不允许使用裸词“GENERIC_READ”

如果引用 GENERIC_READ,它会用作字符串而不是实际标志,反之亦然。

如何解决?

【问题讨论】:

【参考方案1】:

您应该将您自己的代码的操作系统特定位分解为提供统一接口的单独模块,然后 require 根据操作系统选择适当的模块。

为此,您可以使用Sys::Info::OS 和require 和import。以下内容(未经测试)应该可以工作:

use strict; use warnings;

use Sys::Info::OS;

BEGIN 
    my $os = Sys::Info::OS->new;
    if ($os->is_windows) 
        require Win32::API;
        Win32::API->import;

        require Win32API::File;
        Win32API::File->import(qw(
            :Func
            :Misc
            :FILE_
            :FILE_FLAG_
            :FILE_SHARE_
            :FILE_ATTRIBUTE_
            :GENERIC_
        ));
    
    elsif ($os->is_linux) 
        require Fcntl;
        Fcntl->import;

        require File::FcntlLock;
        File::FcntlLock->import;

        require File::Copy;
        File::Copy->import;
    
    else 
        die sprintf "Unknown OS: %s\n", $os->name;
    


# rest of the code

【讨论】:

以上是关于如何在 Perl 中解决 Windows 和 Linux 客户端的“常量标志”?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装多个版本的perl

如何在 Windows 10 中关联 cgi 扩展

如何在ul中显示一个li在其他li之上?

如何在 Windows 上的 Perl 中安装 ExtUtils::PkgConfig?

Perl 如何查看 Windows 快捷方式指向的位置?

mysqlhotcopy 运行报错解决方案