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

Dear Monks,

I have this module which needs to export $variables instead of subs. Can some explain to me how todo this or point me to a manual that deals with this subject ?

Thnx a lot
Luca
  • Comment on Access to (exported?) variabes of a module

Replies are listed 'Best First'.
Re: Access to (exported?) variabes of a module
by gellyfish (Monsignor) on Jun 01, 2006 at 09:55 UTC

    You can export variables using exactly the same Exporter mechanism as you can with subroutines. E.g:

    (PackVar.pm): package PackVar; + use base Exporter; + use vars qw(@EXPORT $Test); + @EXPORT = qw($Test); + $Test = 1; + 1; (test.pl): use strict; + use PackVar; + print $Test,"\n";
    which works fine. Note that the exported variables must be package and not lexical variables: you need to declare them in the module with use vars or our (or use the fully package qualified name) and not declare them with my.

    However you really, really, really do want to think carefully about exporting variables like this even more than you do with subroutines as this constitutes a more serious pollution of the callers namespace with a higher risk of collision, unless you have absolutely no way around this you should use fully package qualified names (e.g. $PackVar::Test) in the caller and document this usage.

    /J\

      It's somewhat safer if you use @EXPORT_OK rather than @EXPORT and make the caller explicitly use PackVar qw( $Test ) to get the variable in their namespace. That also documents where $Test is coming from in the using code.

      But seconded on the recommendation to prefer fully qualified names; if I don't I make sure to use the explicit import (then again I almost always use an explicit import list for subs as well . . .).

Re: Access to (exported?) variabes of a module
by davorg (Chancellor) on Jun 01, 2006 at 09:54 UTC

    Variables are exported in exactly the same way as subroutines are (tho' you'll need to ensure that they are package variables, not lexical variables).

    See Exporter for more details.

    --
    <http://dave.org.uk>

    "The first rule of Perl club is you do not talk about Perl club."
    -- Chip Salzenberg

Re: Access to (exported?) variabes of a module
by Tobin Cataldo (Monk) on Jun 01, 2006 at 13:08 UTC
    Alternatively, you could write your own get/set functions for the module.

    let say I have a module
    my @AoA = ( #Array of Array Stuff ); my %fundHash = ( # Hash Stuff ); # return array reference sub return_AoA { return \@AoA; } # return hash reference sub return_fundHash { return \%fundHash; }


    In my main program I will have
    use perlMod; my $AoA = perlMod::return_AoA(); my $fundHash = perlMod::return_fundHash();


    And since you are passing by reference in this case, you will need to dereference in order to actually use the variable values...
    my $toMail = $$AoA[$i][2] . "\@mail.host";


    Tobin