Alex Rivera | Logout

How do I conditionally use a Perl module only if I'm on Windows?

Asked 2009-09-17T22:43:28.510
9

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?

Edit
Report

2 Answers

21

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.

(EDIT, a few years later...)

This is even better though:

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

Read more about the if pragma here.

answered 2009-09-17T23:37:40.027
1

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.

answered 2009-09-17T23:01:48.393

Your Answer