use strict; use warnings; my $my_input = 'xxxc=2&xxx1=val1&xxx2=val2'; my @fv_pairs = split /\&/ , $my_input; my %INPUT; foreach (@fv_pairs) { my ($field, $value) = split /=/, $_, 2; next unless defined $value; $value =~ s/\+/ /g; $value =~ s/%(\dA-Fa-f{2})/pack("C", hex($1))/eg; $INPUT{$field}=$value; } print join "\n", map {"$_ => $INPUT{$_}"} sort keys %INPUT; #### xxx1 => val1 xxx2 => val2 xxxc => 2