Thread Unbestimmt tiefen HashinHash erzeugen
(14 answers)
Opened by scriptor at 2009-08-09 00:58 Quote Wenn der Schlüssel (bei mir "$key", bei dir "$_") von einem anderen Typ ('HASH' oder 'ARRAY') ist als die Refenz (bei mir "$ref" bei dir "$$res"). Ich halte es für wichtig, das ab zu fangen ohne eine InterpreterWarnung zu provozieren. Quote Stimmt habe ich übersehen. wenn man zwischen Zeile 63/64 folgenden Code einfügt wird das auch abgefangen: Code (perl): (dl
)
1 2 if(ref_type(($ref_type eq 'HASH')? $ref->{$key}: $ref->[$key])) { return "Can't replace Reference by Value in ".join('_',@path)." ($key)"; } Dein Ansatz ist besser, habe nicht mehr daran gedacht, dass man auch Referenzen referenzieren kann. Damit umgeht man das Problem mit dem setzen des Wertes am Schluss. Aber ich würde es noch ein wenig anders schreiben: 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 sub QueryToHash { my $query = shift ; # der string mit der Query my $result; $result={}; for my $parameter (split(/\&/, $query)) { my ( $p_name, $p_value ) = split(/=/, $parameter,2); my $error=set_value($result,[split(/_/,$p_name)],$p_value); warn $error if($error); } return $result; } sub set_value { my $ref=shift; my $res=\$ref; my $query=shift; my $val=shift; my @path; for my $key ( @$query ) { push(@path,$key); if ( $key=~/^\d+$/ ) { if(ref($$res) && ref($$res) ne 'ARRAY') { return "Incorrect query! last key of '".join('_',@path)."' not same type as in tree\n"; } $res = \$$res->[$key]; } else { if(ref($$res) && ref($$res) ne 'HASH') { return "Incorrect query! last key of '".join('_',@path)."' not same type as in refernce\n"; } $res = \$$res->{$key}; } } if ( ref $$res ) { return "Incorrect query! '".join('_',@path)."' points to a location that already holds data.\n"; } else { $$res = $val; } return 0; } Das gibt ein paar mehr Fehlermeldungen aus und das Zerlegen des QueryStrings ist vom Setzen des Wertes getrennt. |