Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things

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
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (6)
As of 2018-04-20 09:26 GMT
Find Nodes?
    Voting Booth?