#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub QueryToHash { my $query = shift ; # der string mit der Query my $resulthash={}; my @parameter_arr = split /\&/, $query ; foreach my $parameter (@parameter_arr) { my ( $p_name, $p_value ) = split /=/, $parameter ; my $error=set_value($resulthash,[split('_',$p_name)],$p_value); die $error if($error); } return $resulthash; } sub set_value { my $ref=shift; my $query=shift; my $val=shift; # understandable errormessage my @path; while(@$query) { my $key=shift(@$query); my $ref_type=ref_type($ref); my $key_type=key_type($key); if($ref_type eq $key_type) { my $nkey_type=key_type($query->[0]); if($nkey_type) { my $nref=($ref_type eq 'HASH')? $ref->{$key}: $ref->[$key]; my $nref_type=ref_type($nref); if($nref_type) { $ref=$nref; } else { # no ref to hash or array # create ref if($ref_type eq 'HASH') { $ref->{$key}=($nkey_type eq 'HASH')?{}:[]; $ref=$ref->{$key}; } else { $ref->[$key]=($nkey_type eq 'HASH')?{}:[]; $ref=$ref->[$key]; } } } else { # @$query empty # set val; if($ref_type eq 'HASH') { $ref->{$key}=$val; } else { $ref->[$key]=$val; } } } else { # ERROR return "Type dismatch ref=$ref_type <=> key=$key_type in ".join('_',@path)." ($key)"; } push(@path,$key); } return 0; } sub ref_type { my $ref=shift; return undef if(!defined($ref)); return 'HASH' if(ref($ref) eq 'HASH'); return 'ARRAY' if(ref($ref) eq 'ARRAY'); return undef; } sub key_type { my $key=shift; return undef if(!defined($key)); return $key=~/^\d+$/?'ARRAY':'HASH'; } print Dumper( QueryToHash('nur_ein_test_mit_zahl_123=456&nur_ein_test_ohne_zahl=789') );