in reply to Re^2: CGI.pm: automatically decode param()
in thread CGI.pm: automatically decode param()

Have you considered installing your own private Perl library then? Installing locally is easy for modules that you can simply copy, like CGI.pm. I haven't look at a workaround to make PREFIX work with Debian, so you'll have some trouble if you want to install Perl modules locally using the standard <c>perl Makefile.PL PREFIX=~moritz/perl-lib; make test; make install

dance.

  • Comment on Re^3: CGI.pm: automatically decode param()

Replies are listed 'Best First'.
Re^4: CGI.pm: automatically decode param()
by moritz (Cardinal) on Sep 03, 2007 at 10:51 UTC
    Sooner or later I'll have to do that I think.

    My current approach is a wrapper (not yet tested), I haven't decided yet which approach I like better (or which I detest less ;-)

    package MyCGI; use base CGI; use strict; use warnings; use Encode qw(encode); sub param { my $self = shift; if (@_ == 1){ my @val = $self->SUPER::param(@_); @val = map { encode("utf8", $_) } @val; return wantarray ? @val : $val[0]; } else { return $self->SUPER::param(@_); } } 1;
      Watch out for file upload fields: if you utf-encode $q->param('upload'), you'll mangle the underlying filehandle. I use an override that's pretty much the same as yours, except that I added the following check:
      sub param { my $self = shift; if (@_ == 1){ my @val = $self->SUPER::param(@_); @val = map { maybe_decode( $_ ) } @val; # rest of your param() } sub maybe_decode { my $p = shift; return ( !$p || ( ref $p && fileno($p) ) ) ? $p : encode('utf8', $p); }