#$data = "five[5]=12345&ten[10]=12345=678=90&six[6]=123456"; $data = "five[5]=12345&ten[12]=12345=678=90&six[6]=123456"; for (;;) { $data =~ s/(.+?)\[(\d+)\]=// or last; $hash{$1} = substr($data, 0, $2, ''); $data =~ s/^&// or last; } die("Bad input\n") if length $data; use Data::Dumper; print Dumper(\%hash);