Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Re: How to change the symbol table to wrap a sub in another sub ?

by Withigo (Friar)
on Sep 21, 2006 at 19:18 UTC ( #574241=note: print w/ replies, xml ) Need Help??


in reply to How to change the symbol table to wrap a sub in another sub ?

Thanks for the quick replies!
I poked around CGI.pm and discovered that param() is already calling Encode::decode_utf8, so I don't need to! But decode is only called if the charset() is set to utf-8.
So I also tried the following, which works sometimes, and sometimes not. I'm not sure why the charset gets unset sometimes. In the end I used ikegami's solution. Thanks ikegami!

BEGIN{ no strict 'refs'; my $real_new = \&CGI::new; *{"CGI::new"} = sub { my $cgi = &$real_new(@_); $cgi->charset('utf-8'); return $cgi; }; }
However, I am confused about one thing in the code suggested.

I always thought that if you take a reference, and then change the underlying typeglob, then the referent must now refer to the new typeglob. The above $real_new refers to the CODE slot in the CGI::new typeglob, and then I put a new sub into the CODE typeglob, so why does $real_new still refer to the contents of the old CODE slot?

And I'm still intersted in seeing out how to do this by using a typeglob instead of a reference to a sub.


Comment on Re: How to change the symbol table to wrap a sub in another sub ?
Download Code
Re^2: How to change the symbol table to wrap a sub in another sub ?
by chromatic (Archbishop) on Sep 21, 2006 at 19:37 UTC
    I always thought that if you take a reference, and then change the underlying typeglob, then the referent must now refer to the new typeglob.

    Why would it do that? If Perl worked that way, it would need two types of references. One would work for items not in a symbol table (anonymous data structures and subroutines, for example, or references to lexicals) and the other would always look up the referent through the symbol table for each access.

    ... why does $real_new still refer to the contents of the old CODE slot?

    Because perl does the lookup once, finds the contents, and makes a reference to it. Changing what's in the slot after you've already fetched something from the slot only changes what's currently in the slot. It doesn't change what was in the slot previously.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (15)
As of 2014-07-10 20:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (215 votes), past polls