Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options

Passing around symbol table aliases

by gnosti (Hermit)
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:

#### 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:

#### package main; our (%tn, %ti, %bn); package ChainSetup; my $master_fader = $tn{Master};
But now, I am refactoring this to use Exporter.
#### package Globals; use Exporter; our @ISA = 'Exporter'; our @EXPORT_OK = qw( %tn %ti %bn); #### use Globals qw(%tn %ti %bn); *tn = \%Track::by_name; *ti = \%Track::by_index; *bn = \%Bus::by_name; #### 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:
#### 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

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

Replies are listed 'Best First'.
Re: Passing around symbol table aliases
by ikegami (Pope) on Sep 07, 2011 at 02:58 UTC
    #### 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 ); #### package ChainSetup; use Globals qw( %tn %ti %bn ); print $tn{Master}->name;
      That does it. Thanks!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://924505]
Approved by ww
[Corion]: From time to time, you actually uncover things that always were wrong ;)
[Happy-the-monk]: Discipulus: please, what are the labels for CTRL+SHIFT+TAB on an Eatalian keyboards?
[Discipulus]: yes but ireally do not understand anonymous's reply about cpan r command: found no bug with that number and points to mjd.. doh?!
[Discipulus]: Happy-the-monk CTRL is the same. SHIFT is a big fat arrow pointing up. TAB are two opposite arrows on each other pointing left/rigth

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2017-11-21 09:58 GMT
Find Nodes?
    Voting Booth?
    In order to be able to say "I know Perl", you must have:

    Results (297 votes). Check out past polls.