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

Hello All, I have following question regarding accessing variable from other module: In test.pm I have following:
#BEGIN OF THE TEST.PM package test; use strict; use warnings; # # The object responsible for managing the database connections. # my $dbaccess = undef; #somewhere else $dbaccess = new tmp::tmp2::DBAccess( %dbURL); #END OF THE TEST.PM
In test2.pm I have following:
#BEGIN OF THE TEST2.PM package test2; use strict; use warnings; # How to access dbaccess from test.pm?? #END OF THE TEST2.PM
My question is how to access $dbaccess variable (object) defined and initialized in test.pm within test2.pm module? I can not change anything in test.pm. Thanks, Bogumil

Replies are listed 'Best First'.
Re: access to the variable in other pm
by chromatic (Archbishop) on Feb 02, 2006 at 22:40 UTC
    I can not change anything in test.pm.

    Then you're in trouble, unless you install PadWalker and somehow get ahold of the topmost pad for the test package, shuffle through it to find the appropriate slot for $dbaccess, and keep ahold of the reference.

    It's not impossible by any means -- but the easiest way by far is to change test.pm.

Re: access to the variable in other pm
by leocharre (Priest) on Feb 02, 2006 at 22:06 UTC

    make sure your module 1 exports the symbol you want

    if say..
    main.cgi is doing

    use TEST1; use TEST2;

    and TEST1.pm is exporting $dbaccess as...

    package TEST1; use vars qw{$VERSION @ISA @EXPORT @EXPORT_OK}; require Exporter; @ISA = qw(Exporter); @EXPORT = qw($dbaccess); # just to calling package ! $VERSION = '0.01'; use strict; my $dbaccess= 'whatever';

    then TEST2.pm would...

    $main::dbaccess->prepare('yo 5h1+3'); #or .. $TEST1::dbaccess->prepare('yo 5h1+3'); # play around.
      make sure your module 1 exports the symbol you want

      Well, not necessarily: he may write accessory subs to be used like methods and call them... ehm, like methods. This may be either an overkill or The Best Way™ depending on the actual purpose, scope and aim of his code. But indeed your suggestion is more akin to what the OP actually asked. As a side note, I'd just add

      use base 'Exporter'; our @EXPORT = qw($dbaccess); # hey, I always C<use strict;> at the ve +ry top!

      as another, fundametally identical - but somewhat more modern, "WTDI".