use strict; use warnings; use Foo; use CGI qw/:standard/; my $q = CGI->new( { foo => 'bar', baz => 'Ovid' } ); my $foo = Foo->new; print $foo->list_params( 1 ); print $foo->list_params( $q ); #### test.pl one=two red=blue red=herring bob= marley=bob #### $VAR1 = { 'one' => 'two', 'red' => [ 'blue', 'herring' ], 'marley' => 'bob', 'bob' => '' }; $VAR1 = { 'foo' => 'bar', 'baz' => 'Ovid' }; #### package Foo; use strict; use Data::Dumper; sub new { my $class = shift; my ( $package ) = caller; my $objref = { _package => $package }; bless $objref, $class; } sub list_params { my ( $self, $cgi ) = @_; my %formdata; # Use this if OO CGI if ( ref $cgi eq 'CGI' ) { foreach my $key ( $cgi->param ) { my @vals = $cgi->param( $key ); $formdata{ $key } = _format_vals( \@vals ); } # Function-oriented CGI } elsif ( $cgi ) { { # Don't try this at home, kids no strict qw/ refs subs /; my $_param = $self->{ '_package' }.'::param'; my $package = \%{$self->{ '_package' } . '::'}; # Looks like a function oriented call but 'param' was not exported if ( ! exists $package->{ 'param' } ) { return 0; } foreach my $key ( eval $_param ) { my $_param_call = $_param . "($key)"; my @vals = eval $_param_call; $formdata{ $key } = _format_vals( \@vals ); } } } else { return 0; } Dumper( \%formdata ); } sub _format_vals { my $vals = shift; @$vals == 1 ? @$vals[ 0 ] : ! @$vals ? undef : $vals; } "Ovid";