Thread Dreidimensionale Hashes mit Skalaren gemischt (4 answers)
Opened by Der aus dem Westen ... at 2012-03-25 14:53

Gast Der aus dem Westen ...
 2012-03-25 14:53
#157017 #157017
Für XML-Requests, die über mehrdimensionale Tags verschachtelt sind, definiere ich jeweils einen Hash, in dem die Werte stehen. Da die Tags mehrdimensional sei können, ist auch der Hash mehrdimenstional:


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#Die Values werden später gefüllt.
my %hash=
(
        '1. Dimension, 1. Entry'=>'',
        '1. Dimension, 2. Entry'=>'',
        '1. Dimension, 3. Entry'=>
        {
                '2. Dimension, 1. Entry'=>'',
                '2. Dimension, 2. Entry'=>'',
        },
        '1. Dimension, 4. Entry'=>
        {
                '2. Dimension, 3. Entry'=>'',
                '2. Dimension, 4. Entry'
                {
                        '3. Dimension, 1. Entry'=>''
                }
        }
        #usw ...
);


Ich übergebe diesen Hash an eine allgemeine Funktion, welche den Hash und seine Subhashes rekursiv durchgeht:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sub generate_xml
{
        my(%mapping,$xml)=(%{$_[0]},'');

        foreach my $tag(sort keys %mapping)
        {
                #Subhash gefunden? Funktion mit diesem Subhash aufrufen.
                if(ref($mapping{$tag}) eq 'HASH')
                {
                        $xml.="<$tag>".generate_xml($mapping{$tag})."</$tag>";
                }
                else
                {
                        $xml.="<$tag>$mapping{$tag}</$tag>";
                }
        }
        return $xml;
}

print &generate_xml(\%hash);


An sich funktioniert das recht prima, allerdings wird mir jedes mal beim Aufrufen der Funktion eine Warnung angezeigt, dass ein uninitialisierter Werte in %mapping zu finden ist - beim Aufrufen und durchgehen des Haupthashes kommt diese Warnung, und bei jedem Aufruf eines Subhashes. Zudem kommt davor die Warnung, dass eine ungerade Zahl von Elementen in der Hashzuweisung auftauchen würde, in genau der Zeile, in der der Hash definiert wird. Ich habe bereits ein wenig getestet und nachgeschaut - die Syntax an sich stimmt, und die Elemente werden auch erkannt. Im XML-Content finden sich zwar leere Tags, aber die Elemente werden erkannt.

Ich bin den Hash schon mehrere Male durchgegangen - Punkt statt Komma, Runde Klammer statt Geschweifte Klammer usw., das bin ich durchgegangen. Ich kann keine unregelmässige Zuweisung der Hashes entdecken und vermute nun, dass es daran liegt, dass ich Skalare und Hashes verwende - in einer anderen Datei verwende ich dieses System ebenfalls, nur mit entweder reinen Skalar- oder Subhash-Hashes, und hier funktioniert es ohne ein Problem. Ansonsten wäre ich jetzt ein wenig ratlos ...

Perl-Version ist 5.10, Ubuntu 10.04
Last edited: 2012-03-25 15:20:17 +0200 (CEST)

View full thread Dreidimensionale Hashes mit Skalaren gemischt