Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Passing around symbol table aliases

by gnosti (Friar)
on Sep 07, 2011 at 02:42 UTC ( #924505=perlquestion: print w/ replies, xml ) Need Help??
gnosti has asked for the wisdom of the Perl Monks concerning the following question:

Estimable Monks,

For brevity in code, I've been using some aliases of the following form in the main namespace of a project:

#### Main.pm package main; *tn = \%Track::by_name; *ti = \%Track::by_index; *bn = \%Bus::by_name; print $tn{Master}->name # Master
Up to now, I used 'our' to give all packages access to these aliases via the main namespace:

#### ChainSetup.pm package main; our (%tn, %ti, %bn); package ChainSetup; my $master_fader = $tn{Master};
But now, I am refactoring this to use Exporter.
#### Globals.pm package Globals; use Exporter; our @ISA = 'Exporter'; our @EXPORT_OK = qw( %tn %ti %bn); #### Main.pm use Globals qw(%tn %ti %bn); *tn = \%Track::by_name; *ti = \%Track::by_index; *bn = \%Bus::by_name; #### ChainSetup.pm package ChainSetup; use Globals qw(%tn %ti %bn); print $tn{Master}->name; # can't do method 'name' on undef
I'm looking for a way to create these aliases in each namespace without using boilerplate. I'd like use Globals to accomplish this. I tried some code like this:
#### Globals.pm package Globals; use Exporter; our @ISA = 'Exporter'; our @EXPORT_OK = qw( %tn %ti %bn); my $pkg = caller(); my $code = '*' . $pkg . '::tn = \%Track::by_name'; eval $code; die "error: $@ in eval of code: $code" if $@;
However, executing use Globals does not appear to provide the package name to caller() in Globals.pm.

I hope this explanation is sufficiently intelligible, and would be grateful for any advice you may have.

Comment on Passing around symbol table aliases
Select or Download Code
Re: Passing around symbol table aliases
by ikegami (Pope) on Sep 07, 2011 at 02:58 UTC
    #### Globals.pm package Globals; use Exporter; *tn = \%Track::by_name; *ti = \%Track::by_index; *bn = \%Bus::by_name; our @ISA = 'Exporter'; our @EXPORT_OK = qw( %tn %ti %bn ); #### ChainSetup.pm package ChainSetup; use Globals qw( %tn %ti %bn ); print $tn{Master}->name;
      That does it. Thanks!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://924505]
Approved by ww
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (6)
As of 2014-07-25 21:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (175 votes), past polls