2009-09-17 7 views
8

El siguiente código de Perl ..¿Cómo uso condicionalmente un módulo Perl solo si estoy en Windows?

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

.. funciona bajo Windows, pero no sigue funcionando bajo todas las otras plataformas ("No se puede encontrar en Win32.pm @INC"). ¿Cómo le indico a Perl que intente importar Win32 solo cuando se ejecuta bajo Windows e ignora la declaración de importación en todas las demás plataformas?

Respuesta

20

Este código funcionará en todas las situaciones, y también realiza la carga en tiempo de compilación, como otros módulos que están construyendo podría depender de ello:

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

Esto se debe a use Module (qw(foo bar)) es equivalente a BEGIN { require Module; Module->import(qw(foo bar)); } como se describe en perldoc -f use.

(EDIT, unos años más tarde ...)

Esto es aún mejor, aunque:

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

leer más sobre el if pragma here.

+0

¡maldición, Ether me ganó! – singingfish

+0

* 'Bareword '' Módulo 'no está permitido mientras se usan' 'estrictos subs' '...' * - se veía tan bien desde la distancia .... – jww

+0

@jww Se supone que debes reemplazar "Módulo" por el nombre del módulo real que quiero cargar Y ese espacio de nombres debe declararse en el archivo con una declaración 'paquete'. – Ether

3

En general, use Module o use Module LIST se evalúan en tiempo de compilación, sin importar dónde aparezcan en el código. El tiempo de ejecución es equivalente

require Module; 
Module->import(LIST) 
1

require Module;

Pero use llama también import, require no. Por lo tanto, si el módulo exporta al espacio de nombre predeterminado, también debe llamar al

import Module qw(stuff_to_import);

También puede eval "use Module" - que funciona muy bien IF perl puede encontrar la ruta adecuada en tiempo de ejecución.

+6

No utilice las llamadas a métodos indirectos, no son las mejores prácticas por asomo. Haga 'Module-> import (qw (cosas));' en su lugar. – Danny

11

Como atajo para la secuencia:

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

puede utilizar el caso de Pragma:

use if $^O eq "MSWin32", "Win32"; # or ..."Win32", your-args; 
Cuestiones relacionadas