tags:

views:

275

answers:

4

The following Perl code ..

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

.. works under Windows, but fails to run under all other platforms ("Can't locate Win32.pm in @INC"). How do I instruct Perl to try import Win32 only when running under Windows, and ignore the import statement under all other platform?

+2  A: 

In general, use Module or use Module LIST are evaluated at compile time no matter where they appear in the code. The runtime equivalent is

require Module;
Module->import(LIST)
mobrule
+1  A: 

require Module;

But use also calls import, require does not. So, if the module exports to the default namespace, you should also call

import Module qw(stuff_to_import);

You can also eval "use Module" - which works great IF perl can find the proper path at runtime.

TheDauthi
Do not use indirect method calls, they are not Best Practices by a long shot. Do `Module->import(qw(stuff));` instead.
Danny
+14  A: 

This code will work in all situations, and also performs the load at compile-time, as other modules you are building might depend on it:

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

This is because use Module (qw(foo bar)) is equivalent to BEGIN { require Module; Module->import( qw(foo bar) ); } as described in perldoc -f use.

Ether
damn, Ether beat me to it!
singingfish
+9  A: 

As a shortcut for the sequence:

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

you can use the if pragma:

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