Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^2: Interesting behavior in eval block

by l2kashe (Deacon)
on Jun 19, 2008 at 18:45 UTC ( #692994=note: print w/ replies, xml ) Need Help??


in reply to Re: Interesting behavior in eval block
in thread Interesting behavior in eval block

That makes sense, but this is a contrived minimal example of the implementation. This will be run well after compile time off of config data, or object instantiation values. So the questions is can I somehow muck with the symbol table to get where I want to be? Maybe something like

while ( my($module, $args) = each %$toLoad ) { my $str = "use $module "; # to fix typo in example $str .= 'qw(' . $args . ')' if $args ne '1'; eval $str; # Try and remap symbol tables to the right spot unless ( $args eq '1' ) { no strict 'refs'; foreach my $key ( split/\s+/, $args ) { *$key = *$module::$key; } } # END unless args eq 1 } # END while each toLoad

This would cover the standard cases but fail for things like use CGI qw(:all); and similar megaKeywords

I imagine this is a standard pattern, I just don't know where to look for the docs to get at what I want without potentially digging into other modules EXPORT_* variables, which doesn't seem right either

use perl;
Everyone should spend some time pounding nails with their forehead for a while before they graduate to complicated stuff like hammers. - Dominus


Comment on Re^2: Interesting behavior in eval block
Download Code
Replies are listed 'Best First'.
Re^3: Interesting behavior in eval block
by ikegami (Pope) on Jun 19, 2008 at 18:52 UTC

    Your "trick" doesn't work. You're just duplicating the work the implicit import in use already does. Like I said in my original post, it's *when* it happens that's important.

    You have the right idea, but it needs to be done at compile-time. Fortunately, it's very simple since Perl already provides a means of declaring a function that's to be defined at a later time.

    sub gettimeofday(); # Eventually. eval "use Time::HiRes qw( gettimeofday ); 1" or die "Unable to load Time::HiRes: $@\n"; print(gettimeofday);

    The parens in "sub gettimeofday();" are only there because Time::HiRes declares the function using that prototype.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://692994]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (22)
As of 2015-07-28 19:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (258 votes), past polls