Thread Ordnerstruktur in DB abbilden - evt. eigene DB (File) schreiben? (34 answers)
Opened by lousek at 2011-02-24 00:10

lousek
 2011-03-01 17:04
#146156 #146156
User since
2011-01-19
28 Artikel
BenutzerIn

user image
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:
Code (perl): (dl )
1
2
                my $scan = \%ret;
                $scan = $scan->{shift @parts} ||= {} while @parts;


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
2
Can't modify single ref constructor in logical or assignment (||=) at ./syncDBwithFS3.pl line 93, near "} for"
Execution of ./syncDBwithFS3.pl aborted due to compilation errors.


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




View full thread Ordnerstruktur in DB abbilden - evt. eigene DB (File) schreiben?