in reply to Side effects of use-ing base (vs our @ISA)

Are you sure you need the 'use lib' in the "second thing"? For me it works with just the 'use Totally::Fake', without the need of 'use lib'.

Also note that "-M Foo" is *not* the same as "use Foo;". Perlrun says:

-M[-]module -M[-]'module ...' -[mM][-]module=arg[,arg]... -mmodule executes "use" module "();" before executing your program. -Mmodule executes "use" module ";" before executing your program. You can use quotes to add extra code after the module name, e.g., '-Mmodule qw(foo bar)'. If the first character after the -M or -m is a dash ("-") then the 'use' is replaced with 'no'. A little builtin syntactic sugar means you can also say -mmodule=foo,bar or -Mmodule=foo,bar as a short- cut for '-Mmodule qw(foo bar)'. This avoids the need to use quotes when importing symbols. The actual code generated by -Mmodule=foo,bar is "use module split(/,/,q{foo,bar})". Note that the "=" form removes the distinction between -m and -M.

The important part is:

-mmodule executes "use" module "();"

Note the trailing (), meaning that the modules import routine will not be called. So, Exporter won't export the variables.

Abigail

Replies are listed 'Best First'.
Re: Re: Side effects of use-ing base (vs our @ISA)
by ViceRaid (Chaplain) on Sep 10, 2003 at 11:29 UTC

    Thanks Abigail

    Are you sure you need the 'use lib' in the "second thing"? For me it works with just the 'use Totally::Fake', without the need of 'use lib'.

    I've double-checked it and stripped it down to it's barest bones:

    ### Totally/Fake.pm use strict; package Totally::Fake; our @ISA = qw(Exporter); our ($fake, $faker); our @EXPORT = qw($fake $faker); ### my_script.pl use strict; # uncomment this to make it work # use lib '/long/path/to/nowhere'; use Totally::Fake; print $fake;

    ... and I'm still getting the odd behaviour (perl 5.8.0).

    Also note that "-M Foo" is *not* the same as "use Foo;" ... -Mmodule executes "use" module ";" before executing your program. (perldoc perlrun)

    Doesn't this mean -MFoo == use Foo; but -mFoo != use Foo;? In that -M will call the import routine for the default set of symbols, but -m will not call it.

    Cheers
    ViceRaid

      Your Totally/Fake.pm doesn't have a "use Exporter;". How adding 'use lib' makes perl compile my_script.pl seems like a bug to me.

      Doesn't this mean -MFoo == use Foo; but -mFoo != use Foo;? In that -M will call the import routine for the default set of symbols, but -m will not call it.

      Yes it does. I completely misread.

      Abigail

        Ah, I got it.

        "use lib" does a "use Config", which does a "use Exporter". So, if you have a "use lib", Exporter is loaded, making your Totally::Fake.pm work, despite the absense of "use Exporter" in that file.

        Abigail