gnosti has asked for the wisdom of the Perl Monks concerning the following question:
For brevity in code, I've been using some aliases of the following form in the main namespace of a project:
Up to now, I used 'our' to give all packages access to these aliases via the main namespace:#### Main.pm package main; *tn = \%Track::by_name; *ti = \%Track::by_index; *bn = \%Bus::by_name; print $tn{Master}->name # Master
But now, I am refactoring this to use Exporter.#### ChainSetup.pm package main; our (%tn, %ti, %bn); package ChainSetup; my $master_fader = $tn{Master};
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); #### 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
However, executing use Globals does not appear to provide the package name to caller() in Globals.pm.#### 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 $@;
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 (Patriarch) on Sep 07, 2011 at 02:58 UTC | |
by gnosti (Chaplain) on Sep 07, 2011 at 04:00 UTC |