#perl
#perl
Вопрос:
Я использую следующие библиотеки 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 как
ОШИБКА СКРИПТА: простое слово «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: %sn", $os->name;
}
}
# rest of the code