Cross Platform Perl
rickm at isite.net.au
rickm at isite.net.au
Wed Oct 16 22:56:05 CDT 2002
Doh! Should have checked mail again before replying. Paul's solution is better
than mine :)
Quoting Paul Fenwick <pjf at perltraining.com.au>:
> G'day Everyone,
>
> Rob and Adam are indeed correct. You do need a string
> eval and not a block eval. My mistake. :)
>
> Cheers,
>
> Paul
>
> On Thu, Oct 17, 2002 at 01:27:37PM +1000, Rob Casey wrote:
> > Just a follow up to this ...
> >
> > > BEGIN { # So we run at the same time as most use
> > statements.
> > > if ($^O eq 'MSWin32') {
> > > eval { use My::Module; }
> > > }
> > > }
> >
> > This will fail - As the compiler will find this use statement and
> > attempt to include the module at this point. To make use of dynamic
> > loading of modules, the eval statement must called with a string
> > argument as this string is not interpreted at compile time, but at the
> > time of execution.
> >
> > Regards,
> > Rob
> >
> >
> > Rob Casey
> > Business Manager, Senior IT Consultant
> > Cowsnet Internet and Professional Services
> > http://www.cowsnet.com.au
> >
> >
> >
> > -----Original Message-----
> > From: owner-melbourne-pm at pm.org [mailto:owner-melbourne-pm at pm.org] On
> > Behalf Of Paul Fenwick
> > Sent: Thursday, 17 October 2002 1:02 PM
> > To: Adam Clarke
> > Cc: melbourne-pm at pm.org
> > Subject: Re: Cross Platform Perl
> >
> >
> > G'day Adam,
> >
> > On Thu, Oct 17, 2002 at 12:42:42PM +1000, Adam Clarke wrote:
> >
> > > I'm trying to write a script that runs on Linux (Unix) and Win32. I
> > want
> > > to /use/ a module when on Win32 (to access the registry) that doesn't
> > > exist in Unixy perl. Is there a way to skip a use statement at runtime
> >
> > > based on platform or is the only/best way to make a full build
> > > (MakeMaker thing) and handle the differences there somehow. If the
> > > latter, anyone got some simple pointers.
> >
> > Glad you asked! Perl has a variable called $^O (or $OSNAME when
> > using English) that gives you the name of the operating system
> > you're running under.
> >
> > So you can do the following:
> >
> > BEGIN { # So we run at the same time as most use statements.
> > if ($^O eq 'MSWin32') {
> > eval { use My::Module; }
> > }
> > }
> >
> > The eval is needed because usually use statements get executed
> > immediately, regardless of context. The BEGIN means that your
> > chunk of code is executed "at compile time". If this isn't important,
> > you can leave the BEGIN block out.
> >
> > There's lots of code out there which does different things depending
> > upon the OS. Take a look at File::Copy's source code
> > (perldoc -m File::Copy) to see a lot of this in action.
> >
> > Cheers,
> >
> > Paul
> >
> > --
> > Paul Fenwick <pjf at perltraining.com.au> | http://perltraining.com.au/
> > Director of Training | Ph: +61 3 9354 6001
> > Perl Training Australia | Fax: +61 3 9354 2681
> >
>
>
>
> --
> Paul Fenwick <pjf at perltraining.com.au> | http://perltraining.com.au/
> Director of Training | Ph: +61 3 9354 6001
> Perl Training Australia | Fax: +61 3 9354 2681
More information about the Melbourne-pm
mailing list