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

topeg
 2009-08-09 22:10
#124019 #124019
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Quote
* Hast du ein Beispiel für einen 'Type dismatch', ich verstehe nicht so recht, wie es dazu kommen kann.

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
* Wenn man an deinen Beispielstring ein '&nur_ein_test=10' anhängt, wird die Struktur zerstört.

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.

View full thread Unbestimmt tiefen HashinHash erzeugen