Thread Ordnerstruktur in DB abbilden - evt. eigene DB (File) schreiben?
(34 answers)
Opened by lousek at 2011-02-24 00:10
Hallo topeq
Jetzt gibt es aber das Problem, dass die Funktion addToTree beim Hash-Tree die Werte nicht einfach auf ein "leeren" (?) Hash gesetzt werden (also = {}), sondern auf "undef": Code (perl): (dl
)
1 2 3 # build the hash-tree for this path my $ref=\$tree; $ref = \$$ref->{$_} for(@parts); Hash-Tree: 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 $VAR1 = { 'data' => { 'test4' => { 'abcdwxyz1' => { 'abcdwxyz1' => { 'abcdwxyz1' => { 'abcdwxyz1' => undef, 'abcdwxyz3' => undef, 'abcdwxyz2' => undef }, 'abcdwxyz3' => { 'abcdwxyz1' => undef, 'abcdwxyz3' => undef, 'abcdwxyz2' => undef }, 'abcdwxyz2' => { 'abcdwxyz1' => undef, 'abcdwxyz3' => undef, 'abcdwxyz2' => undef } }, ... Da jedoch dann in der Funktion checkFolder mit if(defined) geprüft wird, ob dies der letzte Part ist (egal ob mit deinem Beispiel (while) oder meinem (for)), bleibt bei den "untersten" Ebenen $found immer auf 0 (not found in database): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 if(defined($tmphash->{$part})) { # Does the part exists in the hash-tree? if($i == @parts-1) { # Is this the last part of the path? $found=1; # Yes, the folder is in the database! } else { # Not the last part of the path $tmphash=$tmphash->{$part}; # Go one level further } } else { last; # The path is not in the database } An einem anderen Ort hatte ich mal das folgende Konstrukt: Also solange noch eine tiefere Ebene vorhanden war, wird als Wert eine Hash-Referenz gesetzt und sobald die unterste Ebene erreicht wurde, wird der Hash auf "leer" (?) gesetzt. Beispiel-Hash-Tree: 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 $VAR1 = { 'data' => { 'test4' => { 'abcdwxyz1' => { 'abcdwxyz1' => { 'abcdwxyz1' => { 'abcdwxyz1' => {}, 'abcdwxyz3' => {}, 'abcdwxyz2' => {} }, 'abcdwxyz3' => { 'abcdwxyz1' => {}, 'abcdwxyz3' => {}, 'abcdwxyz2' => {} }, 'abcdwxyz2' => { 'abcdwxyz1' => {}, 'abcdwxyz3' => {}, 'abcdwxyz2' => {} } }, ... Jedoch klappt diese Lösung nicht beim "aktuellen" Code: Code (perl): (dl
)
1 2 3 # build the hash-tree for this path my $ref=\$tree; $ref = \$$ref->{$_} ||= {} for(@parts); Error: Code: (dl
)
1 Can't modify single ref constructor in logical or assignment (||=) at ./syncDBwithFS3.pl line 93, near "} for" Ich weiss nicht ganz, wo ich jetzt ansetzten soll, ohne dass ich diese beiden Zeile wieder auf irgendwie auf 50 Zeilen hässlich anderst zusammen bastle ... ? Gruss & vielen Dank Lousek |