Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

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 examining the Monastery: (5)
As of 2018-02-18 18:31 GMT
Find Nodes?
    Voting Booth?
    When it is dark outside I am happiest to see ...

    Results (256 votes). Check out past polls.