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

topeg
 2009-08-09 15:47
#124006 #124006
User since
2006-07-10
2611 articles
BenutzerIn

user image
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)

View full thread Unbestimmt tiefen HashinHash erzeugen