Как я могу включить модули Win32 только тогда, когда я запускаю свой Perl-скрипт в Windows? - PullRequest
1 голос
/ 21 мая 2009

У меня есть проблема, на которую я не могу найти ответ.

С Perl мне нужно использовать скрипт на платформах Windows и Unix. Проблема в том, что в Windows мы используем специальные Win32-модули, такие как Win32 :: Process , и эти модули не существуют в Unix.

Мне нужен способ включить эти модули Win32 только в Windows.

if($^O =~ /win/i)
{
    use win32::process qw(CREATE_NEW_CONSOLE);
}
else
{
    #unix fork
}

Проблема заключается в том, что оператор использования для окон. Независимо от того, что я пытаюсь это не компилируется на Unix.

Я пытался использовать динамические уловки, требования, НАЧАТЬ и т. Д.

Есть ли хорошее решение этой проблемы? Любая помощь будет принята с благодарностью.

Заранее спасибо,

Dan


Обновление:

Сотрудник указал мне, что это правильный способ сделать это.

require Win32;
require Win32::Process;

my $flag = Win32::Process::CREATE_NEW_CONSOLE();

Win32::Process::Create($process, 
    $program, 
    $cmd, 
    0, 
    $flag, ".") || die ErrorReport();

print "Child started, pid = " . getPID() . "\n";

Спасибо всем за помощь!

Dan

Ответы [ 5 ]

7 голосов
/ 21 мая 2009

use выполняется во время компиляции.

Вместо этого:

BEGIN {
    if( $^O eq 'MSWin32' ) {
        require Win32::Process;
        # import Win32::Process qw(CREATE_NEW_CONSOLE);
        Win32::Process->import(qw/ CREATE_NEW_CONSOLE /);
    }
    else {
        #unix fork
    }
}

См. perldoc для использования .

Также см. perlvar на $^O.


Обновление:

Как указывает Синан Унур, лучше всего избегать синтаксиса косвенного объекта .

Я использую прямые вызовы методов во всех случаях, кроме вызовов import. Вероятно, потому что import маскируется как встроенный. Поскольку import действительно метод класса, его следует вызывать как метод класса.

Спасибо, Синан.

Кроме того, в системах Win32 вы должны быть очень осторожны, чтобы получить правильную прописную букву имен ваших модулей. Неправильная капитализация означает, что символы не будут импортированы должным образом. Это может быть некрасиво. use win32::process может показаться нормально работать.

3 голосов
/ 21 мая 2009

Вы уверены, что win32 :: process может быть загружен в OSX? «Дарвин» соответствует вашему / win / i.
Вы можете использовать http://search.cpan.org/dist/Sys-Info-Base/, который пытается сделать правильные вещи.

Помимо этого, можете ли вы опубликовать пример кода, который вы на самом деле используете, полученное сообщение об ошибке и на какой платформе Unix (uname -a)?

0 голосов
/ 22 мая 2009

Вы можете просто разместить код вашей платформы внутри eval{} и проверить на наличие ошибки.

BEGIN{
  eval{
    require Win32::Process;
    Win32::Process->import(qw'CREATE_NEW_CONSOLE');
  };
  if( $@ ){ # $@ is $EVAL_ERROR

    # Unix code here

  }
}
0 голосов
/ 21 мая 2009

Вот ответ на ваш второй набор вопросов:

Используете ли вы strict и warnings?

Вы определили подпрограмму ErrorReport()? ErrorReport() является просто примером в кратком изложении Win32 :: Process .

CREATE_NEW_CONSOLE, вероятно, не является числовым, потому что он не импортирован должным образом. Проверьте заглавные буквы в вашем звонке на import.

Сравните эти строки:

C:\>perl -Mwin32::process  -e "print 'CNC: '. CREATE_NEW_CONSOLE;
CNC: CREATE_NEW_CONSOLE

C:\>perl -Mwin32::process -Mstrict -e "print 'CNC: '. CREATE_NEW_CONSOLE;
Bareword "CREATE_NEW_CONSOLE" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.

C:\>perl -MWin32::Process  -e "print 'CNC: '. CREATE_NEW _CONSOLE;
CNC: 16
0 голосов
/ 21 мая 2009

А как насчет парсера, который изменяет файл в каждой ОС?

Вы можете проанализировать ваш perl-файл с помощью скрипта configure, который работает в обеих операционных системах, для вывода perl с соответствующими предложениями Use. Вы даже можете похоронить действие parse в исполняемом скрипте, чтобы запустить код.

Первоначально я думал о том, что директивы прекомпилятора из C справятся с задачей, но я не очень хорошо знаю Perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...