Как разрешить «постоянные флаги» для клиентов Windows и Linux в Perl? - PullRequest
0 голосов
/ 14 октября 2011

Я использую следующие библиотеки Perl для Linux и Windows, как указано ниже -

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 как

ОШИБКА СКРИПТА: Базовое слово "GENERIC_READ" не допускается, когда используются "строгие подпрограммы"

И если указано GENERIC_READ, оно используется как строка, а не как фактический флаг, и наоборот.

Как решить?

1 Ответ

2 голосов
/ 14 октября 2011

Вы должны разделить специфические для операционной системы биты вашего собственного кода на отдельные модули, представляющие унифицированный интерфейс, а затем require соответствующий модуль в зависимости от операционной системы.

Для этого вы можете использовать Sys :: Info :: OS и требуют и 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...