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

Sorry, I missed to say: upgrading is not an option because I don't have administrative access on the server. (It runs Debian Stable. So let's hope for a fast release of Lenny ;-))
  • Comment on Re^2: CGI.pm: automatically decode param()

Replies are listed 'Best First'.
Re^3: CGI.pm: automatically decode param()
by Corion (Patriarch) on Sep 03, 2007 at 10:19 UTC

    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.

      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); }