Как условно использовать модуль Perl, только если я на Windows? - PullRequest
9 голосов
/ 18 сентября 2009

следующий код Perl ..

if ($^O eq "MSWin32") {
  use Win32;                                                                                                                                                                                           
  .. do windows specific stuff ..
}

.. работает под Windows, но не работает на всех других платформах («Не удается найти Win32.pm в @INC»). Как я могу дать Perl команду попробовать импортировать Win32 только при работе под Windows и игнорировать оператор импорта на всех других платформах?

Ответы [ 4 ]

21 голосов
/ 18 сентября 2009

Этот код будет работать во всех ситуациях, а также выполняет загрузку во время компиляции, так как другие модули, которые вы создаете, могут зависеть от него:

BEGIN {
    if ($^O eq "MSWin32")
    {
        require Module;
        Module->import();  # assuming you would not be passing arguments to "use Module"
    }
}

Это потому, что use Module (qw(foo bar)) эквивалентно BEGIN { require Module; Module->import( qw(foo bar) ); }, как описано в perldoc -f use .

(РЕДАКТИРОВАТЬ, через несколько лет ...)

Это даже лучше, хотя:

use if $^O eq "MSWin32", Module;

Подробнее о прагме if 1016 * здесь .

11 голосов
/ 18 сентября 2009

В качестве ярлыка для последовательности:

BEGIN {
    if ($^O eq "MSWin32")
    {
        require Win32;
        Win32::->import();  # or ...->import( your-args ); if you passed import arguments to use Win32
    }
}

Вы можете использовать прагму if:

use if $^O eq "MSWin32", "Win32";  # or ..."Win32", your-args;
3 голосов
/ 18 сентября 2009

Как правило, use Module или use Module LIST оцениваются во время компиляции, независимо от того, где они появляются в коде. Эквивалент времени выполнения -

require Module;
Module->import(LIST)
1 голос
/ 18 сентября 2009

require Module;

Но use также вызывает import, require - нет. Таким образом, если модуль экспортируется в пространство имен по умолчанию, вам также следует вызвать

import Module qw(stuff_to_import);

Вы также можете eval "use Module" - это прекрасно работает, если Perl может найти правильный путь во время выполнения.

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