Schrift
[thread]11672[/thread]

Dereferenz.(durch Hash aus XML::Simple iterieren)

Leser: 6


<< >> 8 Einträge, 1 Seite
tschloss
 2008-04-21 10:38
#108612 #108612
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Hallo hier im Forum!
Ich wurstle mich bei Perl so durch, aber hin und wieder verliere ich mich in den Strukturen.

Ich habe aus XML::Simple eine Datenstruktur $ref-> hier mit Data::Dumper ausgegegeben.
Code: (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
$VAR1 = {
'photos' => {
'page' => '1',
'photo' => {
'24257747591' => {
'owner' => '258306934@N06',
'isfriend' => '1',
'ispublic' => '0',
'secret' => '6dxxxxc553',
'farm' => '3',
'server' => '2293',
'title' => 'DSCF0049',
'isfamily' => '0'
},
'24265886194' => {
'owner' => '258306934@N06',
'isfriend' => '1',
'ispublic' => '0',
'secret' => 'a53xxxx964',
'farm' => '3',
'server' => '2102',
'title' => 'DSCF0040',
'isfamily' => '0'
},
'24257750595' => {
'owner' => '258306934@N06',
'isfriend' => '1',
'ispublic' => '0',
'secret' => '6exxxxx0ab',
'farm' => '3',
'server' => '2246',
'title' => 'DSCF0035',
'isfamily' => '0'
}
},
'total' => '112',
'pages' => '12',
'perpage' => '10'
},
'stat' => 'ok'
};


Ich will jetzt durch diesen Hash bestehend aus 3 Elementen
'24257747591' => HASH
'24265886194' => HASH
'24257750595' => HASH
iterieren.

Diese Untertruktur sollte eigentlich "$ref->{photos}->{photo}" heißen. Dieser Ausdruck scheint eine Referenz zu sein und nicht vom Typ Hash.
Jedenfalls kommt bei Schleifenversuchen wie
Code: (dl )
1
2
3
while (($key,$value) = each( $ref->{photos}->{photo} )) {
print $key . "\n";
}
oder
Code: (dl )
for $id ( keys $ref->{photos}->{photo} ) {...}

die Fehlermeldung, dass each oder keys einen Hash erwartet.

Wie dereferenziere ich denn hier? Wie notiere ich die Schleife?
Ich bin auch gerne bereit, die Unterstruktur vorher in eine Hashvariable zu kopieren (Das ganze ist weder performance- noch speicherkritisch), aber auch das habe ich nicht hinbekommen.

Danke im voraus!!
Thomas
renee
 2008-04-21 11:07
#108615 #108615
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
# man beachte das %{} , das aus einer Hashreferenz einen Hash macht...
while (($key,$value) = each( %{ $ref->{photos}->{photo}} )) {
print $key . "\n";
}


Code: (dl )
1
2
# hier dasselbe
for $id ( keys %{ $ref->{photos}->{photo} } ) {...}


Lesenswert: perlreftut
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
tschloss
 2008-04-21 11:19
#108617 #108617
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Super vielen Dank!!!
Ich habe es dank der tollen Tuts hier im Forum eben auch herausgefunden. Ich hatte gestern Nacht 3 Stunden lang mit verschiedenen Kombinationen aus {}$% experimentiert ;) , nachdem die Logik nicht mehr weitergebracht hat.
In einem früheren Leben -mit C- war mir das alles klarer, aber bei C gibt es auch immer nur eine korrekte -und explizite- Schreibweise und feddich.

perldsc hat jetzt einiges klarer gemacht.

Vielen Dank!
Viele Grüße
Thomas
nepos
 2008-04-21 11:24
#108618 #108618
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was dir da auch einfach helfen kann ist, dass du mit ref() oder einfach mit print() das gewünschte ausgibst. Kommt da was a la ARRAY(0x...) oder HASH(0x...) raus, weisst du, dass du hier noch dereferenzieren musst, um an die wirklichen Daten zu kommen.
tschloss
 2008-04-21 15:28
#108635 #108635
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Danke, da war ich zum Schluß auf der richtigen Spur. Mir fehlte aber letztlich die Syntax
%{ $hasref }, um es zu derefenzieren.

Anfangs war ich tatsächlich auf der falschen Spur. In C und Pascal nämlich wäre es hier möglich, dass nur die gesamte Struktur eine Referenz besitzt, innerhalbder verschachtelten Struktrur aber nur mit "eingebauten" (d.h. nicht verzeigerten) Arrays/Structs gearbeitet wird. Deswegen dachte ich, dass "ref->{Photos}->{Photo}" ein Hash ist, dabei ist es eine Referenz auf ein Hash.
In der Dumper-Darstellung hätte ich das wahrscheinlich an den { } sehen können (bei Liste oder Hash käme vermutlich ( ) )?

VG Thomas
renee
 2008-04-21 15:45
#108637 #108637
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
tschloss+2008-04-21 13:28:27--
In der Dumper-Darstellung hätte ich das wahrscheinlich an den { } sehen können


richtig!

tschloss+2008-04-21 13:28:27--
(bei Liste oder Hash käme vermutlich ( ) )?


Statt "Hash" meinst Du vermutlich "Array"... Und bei Arrays steht nicht "()", sondern "[]"
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
tschloss
 2008-04-21 15:49
#108638 #108638
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
renee+2008-04-21 13:45:05--

tschloss+2008-04-21 13:28:27--
(bei Liste oder Hash käme vermutlich ( ) )?


Statt "Hash" meinst Du vermutlich "Array"... Und bei Arrays steht nicht "()", sondern "[]"


Kann es keinen Hash innerhalb einer solchen Struktur sondern nur ein Hashref (der dann ja {} ausgezeichnet wäre)?

Und bei Arrays? Ist ein [] denn ein Array oder ein Array-ref?

Danke
Thomas

/edit: in einem anderen Thread fand ich das hier:
pq+2008-04-06 13:47:51--
in verschachtelten datenstrukturen koennen nur skalare stehen. und eine hashreferenz
ist ein skalar.
array of hashes gibt es im prinzip nicht, kann man aber, um sich den mund nicht
fusselig zu reden, durchaus als verkuerzung in dem zusammenhang verwenden.

Also bedeutet dann {} eine Ref auf einen Hash und [] eine Ref auf ein Array. Oder?
Gast Gast
 2008-04-22 16:10
#108726 #108726
Ganz genau so ist es!

Die Dumper-Strukturen sind meist valide Perl-Syntax mit der man eben die gezeigte Struktur bei Ausführung in der jeweiligen Variable ( standard: $VAR1, $VAR2, ... ) gespeichert bekommt.

In Perl kann man nämlich mit {} anonyme Hashes ( Hashreferenzen ohne Variable ) und mit [] anonyme Arrays ( Arrayreferenzen ohne Variable ) erzeugen.

MfG
<< >> 8 Einträge, 1 Seite



View all threads created 2008-04-21 10:38.