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

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

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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://692994]
[marto]: it's a shame Solaris is such a PITA to build on :)
LanX great movie!
[Discipulus]: ah i become monsignor the same day of sysadmin day
[marto]: not so great OS :P
Eily never heard of the movie "LanX"
[Eily]: the LanX OS either now that I think of it :P
[hippo]: Congratulations, Discipulus!
[Discipulus]: Satura Lanx was a latin genre of show
[Discipulus]: coming from the meaning of 'mixed dish'

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (8)
As of 2017-07-28 09:57 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (426 votes). Check out past polls.