如何解决“常量标志”问题适用于 Perl 中的 Windows 和 Linux 客户端?

发布于 2024-12-09 14:19:19 字数 937 浏览 1 评论 0 原文

我正在使用以下 Linux 和 Windows perl 库,如下所示 -

Linux:

use Fcntl; 
use File::FcntlLock

Windows:

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 标志错误

SCRIPT ERROR: Bareword "GENERIC_READ" not allowed while "strict subs" in use

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

如何解决?

I am using following Linux and Windows perl libraries as given below -

Linux:

use Fcntl; 
use File::FcntlLock

Windows:

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

So on the basis of the host(Linux or Windows) I am using to run the scripts, I am loading the package-

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";

} 

Now i am trying to use the flags from Linux or windows client , but if i run the script on Linux client it thrown the error for windows flags as

SCRIPT ERROR: Bareword "GENERIC_READ" not allowed while "strict subs" in use

And if quoted GENERIC_READ, it is used as string not as actual flag and via versa.

How to resolve?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

獨角戲 2024-12-16 14:19:19

您应该将自己代码的操作系统特定部分分解为呈现统一接口的单独模块,然后根据操作系统需要适当的模块。

为此,您可以使用 Sys::Info::OSrequire导入。类似以下内容(未经测试)的内容应该有效:

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

You should factor out operating system specific bits of your own code into separate modules that present a unified interface, and then require the appropriate module depending on operating system.

To do that, you can use Sys::Info::OS and require and import. Something along the lines of the following (untested) should work:

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文