Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

Creating sub from string without munging the symbol table

by stevieb (Canon)
on Jun 22, 2015 at 16:09 UTC ( [id://1131488]=perlquestion: print w/replies, xml ) Need Help??

stevieb has asked for the wisdom of the Perl Monks concerning the following question:

I'm slowly updating one of my larger CPAN modules and came across some code that hacks the symtab to create methods. It works great and is easy to read, but I'm curious if there's a way to do it without needing to utilize the no strict 'refs'.

The original code is designed so that several classes can access their own settings in a config file by using $obj->CONFIG_DIRECTIVE() without having to do $obj->{config}{directive}.

Here's a very basic example without the complexity of the class hierarchy, multi-level hash or config file.

#!/usr/bin/perl use warnings; use strict; my @constants = qw(ONE TWO); for my $member (@constants){ no strict 'refs'; my $thing; *{$member} = sub { $thing = shift if @_; return $thing; } } ONE("1: one\n"); TWO(2); print ONE(), TWO() ."\n";

At the time a few years ago, I must not have found a different way to do this which is why I implemented it in this manner, but am wondering what other Monks think.

Thanks,

-stevieb

Replies are listed 'Best First'.
Re: Creating sub from string without munging the symbol table
by choroba (Cardinal) on Jun 22, 2015 at 16:18 UTC
    You can always use eval, but I don't think it's any better.
    for my $member (@constants){ my $thing; eval "sub $member" . '{ $thing = @_ ? shift : $thing }'; }
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: Creating sub from string without munging the symbol table
by Anonymous Monk on Jun 23, 2015 at 10:35 UTC
    If you can afford a dependency, there is Sub::Install, though it's just some nice API on top of symbol table mangling.
A reply falls below the community's threshold of quality. You may see it by logging in.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1131488]
Front-paged by GotToBTru
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others perusing the Monastery: (5)
As of 2024-04-25 23:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found