use strict; use warnings; use CGI; my $cgi = new CGI; $cgi->param( 'bla[0]', 'bla[0]' ); $cgi->param( 'bla[1]', 'bla[1]' ); $cgi->param( 'foo[\'bar\']', 'foo[\'bar\']' ); $cgi->param( 'foo[\'baz\']', 'foo[\'baz\']' ); # zum testen $cgi->param( 'bla[\'bar\']', 'bla[\'bar\']' ); $cgi->param( 'foo[0]', 'foo[0]' ); my %form; for my $param ( $cgi->param ) { my( $name, $index ); if ( ( $name, $index ) = $param =~ /(\w+)\[(\d+)\]/ ) { if ( defined $form{$name} and ref $form{$name} ne 'ARRAY' ) { warn "$param tries to overwrite a non-array"; } else { $form{$name}->[$index] = $cgi->param( $param ); } } elsif ( ( $name, $index ) = $param =~ /(\w+)\[\'(\w+)\'\]/ ) { if ( defined $form{$name} and ref $form{$name} ne 'HASH' ) { warn "$param tries to overwrite a non-hash"; } else { $form{$name}->{$index} = $cgi->param( $param ); } } else { $form{$param} = $cgi->param( $param ); } } use Data::Dumper; print Dumper \%form;