http://qs1969.pair.com?node_id=228094

Update: this approach is not viable unless you accept heavy caveats. See Re^2: A simple import() for those special moments

Update++: this approach is not viable at all - see Re^4: A simple import() for those special moments..

Occasionally I have a small module that is supposed to keep a small handful of symbols around, most of the time for use with utility scripts that are pretty short themselves. Basically, I don't care for the flexibility Exporter gives me.

Even when I want it, I find the module's interface involving settings up several globals and inheriting from Exporter just plain ugly.

After poking around for a while, I ended up with the following import:

package Foo; use vars qw($foo_var %foo_hash @foo_barr); sub foo_bar { 1 } my $exported = qr/^foo_/; sub import { my $caller = caller() . '::'; do { require Carp; Carp::croak("You cannot specify an import list to Foo"); } if @_ > 1; $main::{$caller}->{$_} = $Foo::{$_} for grep /$exported/, keys %Foo::; } 42;

It will simply export any symbol, regardless of its type (function, hash, array etc) whose name matches the pattern in $exported - in this case all the variables declared with vars and the foo_bar function. It doesn't even have to turn off strictures. :)

Is there any reason I should be wary of this?

Update: fixed logic and syntax error per sauoq's post.

Makeshifts last the longest.