简体   繁体   中英

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

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?

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) ); } BEGIN { require Module; Module->import( qw(foo bar) ); } 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 .

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;

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)

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM