#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $q = 'ein_test_mit_zahl_123=456&ein_test_ohne_zahl=789'; # dies würde einen fehler erzeugen: #$q .= '&ein_test=10'; print Dumper(resolve($q)), "\n"; sub resolve { my( $query ) = @_; my $res = my $tmp = undef; for ( split /\&/, $query ) { my( $path, $val ) = split /\=/; for ( split /\_/, $path ) { if ( /^\d+$/ ) { $$res = [] if ! defined $res; $tmp = $res if ! defined $tmp; $res = \$$res->[$_]; } # if else { $$res = {} if ! defined $res; $tmp = $res if ! defined $tmp; $res = \$$res->{$_}; } # else } # for if ( ref $$res ) { die "Incorrect query!\n'$path' points to a location that already holds data.\n"; } # if else { $$res = $val; } # else $res = $tmp; } #for return $$res; } # resolve