http://www.perlmonks.org?node_id=851721


in reply to Skeleton For Import to Package?

so, how do I get the arguments

Inspect @_ in the import routine.

sub import { my $pkg = shift; # "cacher" in this case my $dir = $_[0] || "/tmp"; setup_cachehash($dir); ... } sub setup_cachehash { ... }

Replies are listed 'Best First'.
Re^2: Skeleton For Import to Package?
by iaw4 (Monk) on Jul 28, 2010 at 15:14 UTC
    thanks. I just realized that my error comes from another source. How do I force the "import" to be the first executed statement? ... answer below
    package cacher; use strict; use warnings; use warnings FATAL => qw{ uninitialized }; # larry, this should have b +een part of warnings. use base 'Exporter'; our @EXPORT = ("pdfpagenum"); BEGIN { my $saved_pkg_args="undefined"; sub import { print "import args: ".join("|", @_)."\n"; $saved_pkg_args= $_[1]; print "in import, saved args '$saved_pkg_args'\n"; } sub test { print STDERR "in test, you have saved '$saved_pkg_args'\n +"; } print "this should executed after the import: $saved_pkg_args.\n" } 1;
    I guess I should just call everything I want to be main code from the import statement itself. still strange that import() is not the first thing called.
      How do I force the "import" to be the first executed statement?

      You can't (at least not with the desired arguments), because cacher->import(...) is being called after the module has been required — at which point any code of the module outside of subroutines will already have been run. That's how use works...

      Update: it's maybe worth mentioning that import is not being called at all if you say use cacher ();. If that's an issue in your case, you might want to setup %cachehash with a default directory at the time the module is being required. Then, in case import is being called, just re-initialize %cachehash with the directory specified as the argument to use.  Kind of like this:

      sub import { ... setup_cachehash($dir) if $dir; } sub setup_cachehash { ... } setup_cachehash("/tmp"); # default

      (From a performance point of view, doing things twice is of course suboptimal...)

      P.S.: if you use Exporter in the same package, you probably want to explicitly call its import routine with the appropriate arguments (first arg = your package name), because normally the import method will be inherited from Exporter. In other words, Exporter's import will no longer be called (automatically) when you implement import yourself...