agianni has asked for the wisdom of the Perl Monks concerning the following question:

I think the code should be pretty self explanitory:

In MyPackage.pm:

package MyPackage; use base qw( Exporter ); @EXPORT = qw( foo ); # create subroutines and export them BEGIN{ for my $sub_name ( qw( bar baz ) ){ *$sub_name = sub { print $sub_name }; push @EXPORT, $sub_name; } } # define a static subroutine for comparison sub foo { print 'foo' } 1;

In export.pl:

#!perl use lib '.'; use MyPackage; foo(); # prints 'foo' MyPackage::bar(); # prints 'bar' bar(); # Generates compile-time warning: # Undefined subroutine &main::bar called at export.pl line 7.

It makes sense to me that this is a problem, as the export must happening before my BEGIN block code is running. So how can I get those subroutines exported? This isn't an XY problem -- I'm working with existing code that I don't have control over that is requiring me to export my functions and I either need to hand code a bunch (hundreds) or get this to work.

Update: Just noticed that using $_ in MyPackage was causing problems. Just updated to declare a lexical.

perl -e 'split//,q{john hurl, pest caretaker}and(map{print @_[$_]}(joi +n(q{},map{sprintf(qq{%010u},$_)}(2**2*307*4993,5*101*641*5261,7*59*79 +*36997,13*17*71*45131,3**2*67*89*167*181))=~/\d{2}/g));'

Replies are listed 'Best First'.
Re: Exporting Dynamically Created Subroutines
by chromatic (Archbishop) on Apr 03, 2007 at 18:02 UTC

    Here's your problem:

    @EXPORT = qw( foo );

    This assignment takes place after the BEGIN block finishes, as the rest of the module executes during a use. It overwrites your carefully-constructed @EXPORT. Move it into the BEGIN block and all is well.

      ++chromatic, that's the simple answer I was looking for! Actually, in an effort to keep my modules that export their functionality standard, I'm doing a: push @EXPORT, qw( foo ); at the top of the script, which works just as well.

      perl -e 'split//,q{john hurl, pest caretaker}and(map{print @_[$_]}(joi +n(q{},map{sprintf(qq{%010u},$_)}(2**2*307*4993,5*101*641*5261,7*59*79 +*36997,13*17*71*45131,3**2*67*89*167*181))=~/\d{2}/g));'
Re: Exporting Dynamically Created Subroutines
by ferreira (Chaplain) on Apr 03, 2007 at 17:40 UTC

    I strongly recommend you to take a look at Sub::Install and Sub::Exporter. Probably, these modules would be enough to provide you with the dynamical exporting capabilities you're looking for.

Re: Exporting Dynamically Created Subroutines
by philcrow (Priest) on Apr 03, 2007 at 17:52 UTC
    In the unlikely event that ferreira's solutions won't work, you could look at how Class::Colon works. There is also an article which goes along with it. The basic plan is to implement your own import method. Usually that's best left to modules, but sometimes you need to do it.

    Phil