Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
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
Replies are listed 'Best First'.
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 drinking their drinks and smoking their pipes about the Monastery: (6)
As of 2015-08-05 08:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The oldest computer book still on my shelves (or on my digital media) is ...













    Results (80 votes), past polls