Thread Unbestimmt tiefen HashinHash erzeugen (14 answers)
Opened by scriptor at 2009-08-09 00:58

MatthiasW
 2009-08-09 17:49
#124011 #124011
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Hm.. dein Code wirft einige Fragen auf:
* Hast du ein Beispiel für einen 'Type dismatch', ich verstehe nicht so recht, wie es dazu kommen kann.
* Wenn man an deinen Beispielstring ein '&nur_ein_test=10' anhängt, wird die Struktur zerstört. Hier ist der Fragesteller gefragt: Soll dies erlaubt sein?

Wenn es denn wirklich sein muss, würde ich es so machen:
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
#!/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

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'

View full thread Unbestimmt tiefen HashinHash erzeugen