in reply to Module dependency

As an example:

# package.pm $var = 'a variable'; sub mySub { print "called!\n"; } 1; ################# # script.pl use package; mySub(); print "Var: " . $var . "\n"; exit 0;

You should note, however, that this isn't always the best behaviour -- frequently, you might want to define multiple namspaces/packages/modules in order to avoid being stuck with a load of globals in a thousand-line script...

It is generally (at least AFAIK) considered much nicer to place things in the @EXPORT_OK array rather than the @EXPORT array where they are automatically dumped into my progam's namespace.

Replies are listed 'Best First'.
RE: Re: Module dependency
by Fastolfe (Vicar) on Sep 07, 2000 at 18:06 UTC
    Simply useing a module does not automatically export variables and subroutines into the calling module. For that you have to use stuff like Exporter to do this job (using, as you note, things like @EXPORT_OK and @EXPORT).

      Funnily enough, that's exactly what I thought -- so I was going to produce a big 'ta-da' with &package::mySub()... but then I wrote and ran the program you see and it worked.

      So, a quick reread of my Perl documentation suggests the following:

      • .pm files can be imported straight into the namespace of the using script if the .pm file lacks a package declaration
      • As soon as a package declaration is made in a .pm file the standard rules of EXPORTing and importing apply
      • So, if I rewrite my code as follows:
      ################## # MyPackage ################## package MyPackage; require Exporter; @ISA = qw(Exporter); @EXPORT = qw(exportedSub); @EXPORT_OK = qw(exportedOkSub); $var = 'a variable'; sub exportedSub { print "Exported sub called!\n"; } sub exportedOkSub { print "ExportedOK sub called!\n"; } 1; ################# # Script.pl ################# use MyPackage qw(exportedOkSub); exportedSub(); exportedOkSub(); print "Var: " . $MyPackage::var . "\n"; exit 0;

      Then it should work as advertised.

      Note, however, that I have done some fudging as MyPackage isn't properly included in my @INC -- so YMMV. :^)

      ~
        Since 'use' is exactly equivalent to a 'require' and an 'import' at compile-time, not specifying a 'package' keyword in your .pm file means the file itself isn't a module/package at all, but is simply Perl code that will be read into the current name space as if you'd done a require "file.pl"; somewhere. You've just changed the extension to pm instead of pl.