Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

how to use different packages depending on host OS?

by smullis (Pilgrim)
on Oct 27, 2004 at 11:22 UTC ( #402954=perlquestion: print w/ replies, xml ) Need Help??
smullis has asked for the wisdom of the Perl Monks concerning the following question:

Hello All,

Does anyone have any suggestions as to how I can use different modules / packages based on the OS of the machine running the script?

The following does not seem to work:

if ($^O =~ /Win/ ) { use Win32::Package } else { use Unix::Package }
I have a vague feeling that eval or AUTOLOAD may have something to do with it... but if I knew then I wouldn't be asking!


Many thanks in advance for any pointers...

SM

Comment on how to use different packages depending on host OS?
Download Code
Re: how to use different packages depending on host OS?
by Corion (Pope) on Oct 27, 2004 at 11:28 UTC

    I can think of at least three variants:

    my $module = $^O =~ /MSWin32/ ? "Win32::Foo" : "Unix::Bar"; # /win/ will make Darwin (OSX) users unhappy :-) eval "use $module" or die "$module didn't return a true value"; die $@ if $@;
    or the manual way of doing what use does:
    BEGIN{ if ($^O =~ /MSWin32/) { require Win32::Foo; Win32::Foo->import(); } else { require Unix::Bar; Unix::Bar->import(); }; };

    Or, if you are not afraid to use modules conceived by Michael Schwern, and you do load modules from several places, like in a plugin setting:

    use UNIVERSAL::require; my $module = $^O =~ /MSWin32/ ? "Win32::Foo" : "Unix::Bar"; $module->require; $module->import(1,2,3);

    There also is the way of completely emulating what use does:

    BEGIN { my $module = $^O =~ /MSWin32/ ? "Win32::Foo" : "Unix::Bar"; my $file = $module . ".pm"; $file =~ s!::!/!g; require $file or die "$file didn't return a true value"; $module->import(); };

    So many options - the most sane ones are upper in this post though.

    Update: Added the fully-manual way of use emulation

      Aha!

      Many thanks Mr. Corion...

      Rgds,
      SM


      ...and it all gets just a little bit clearer...

Re: how to use different packages depending on host OS?
by borisz (Canon) on Oct 27, 2004 at 11:31 UTC
    use require instead of use. See require.
    if ($^O =~ /Win/ ) { require Win32::Package; } else { require Unix::Package; }
    Boris

      You will still need to call import for the package, which use does, but require does not.

      radiantmatrix
      require General::Disclaimer;
      "Users are evil. All users are evil. Do not trust them. Perl specifically offers the -T switch because it knows users are evil." - japhy
Re: how to use different packages depending on host OS?
by Anonymous Monk on Oct 27, 2004 at 14:14 UTC
    use if $^O =~ /Win32/, "Win32::Package"; use if $^O !~ /Win32/, "Unix::Package";

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://402954]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (7)
As of 2014-08-01 06:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (257 votes), past polls