Thread Unbestimmt tiefen HashinHash erzeugen
(14 answers)
Opened by scriptor at 2009-08-09 00:58
Das funktioniert.
Ich hoffe es ist nicht zu kompliziert: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 #!/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') ); Last edited: 2009-08-09 15:54:33 +0200 (CEST) |