Christian Kruse: Splitten in ein Array sinnvoll?

Beitrag lesen

Hallo,

---schnipp---
28.03.2002,news/jungeszene/121203,1
28.03.2002,news/jungeszene/bautzen,1
[...]
---schnipp---

Jetzt moechte ich in der Auswertung eine Art Baum erstellen.
Die 'Äste' sollen sich immer durch einen Split am "/" ergeben. Bei
jeder Ebene moechte ich gern die Summe der Aufrufe sehen.

Na, wo ist denn das Problem? :-)
Das ist ein relativ einfacher Algorithmus:

Variable, um den Baum zu speichern

my $treevar = {hits => 0,childs => undef};

file oeffnen

open DAT,'<file.dat' or die $!;

Zeilenweise einlesen

while(<DAT>) {
  # in Stueckchen zerhackeln
  my ($datum,$url,$hits) = split /,/;

# Pfad in Stueckchen zerhackeln
  my @pieces = split !/!,$url;

# zu jeder Ebene die Hits dazu zaehlen
  my $tv = $treevar;
  foreach my $piece (@pieces) {
    $tv->{childs}->{$piece}->{num} += $hits;
    $tv = $tv->{childs}->{$piece};
  }
}

close DAT;

Ausgabe

gib_aus($treevar,'');

Rekursive Funktion (wir haben eine rekursive Daten-Struktur)

sub gib_aus($$) {
  my $tv   = shift;   # die Baum-Variable
  my $path = shift;   # Der Pfad

if($path) { # beim ersten Aufruf ist '$path' leer
    print "$path: $tv->{num}\n";
  }
  else {
    print "Total: $tv->{num}\n";
  }

# Wenn das Element Kind-Elemente hat,
  # alle Kind-Elemente durchlaufen und pro Kind-Element eine
  # weitere Rekursions-Instanz starten
  if(exists $tv->{childs}) {
    foreach my $p (keys %{$tv->{childs}}) {
      gib_aus($tv->{childs}->{$p},"$path/$p");
    }
  }
}

Ist allerdings ungetestet. Kann also noch ein paar Schoenheitsfehler
haben.

Gruesse,
 CK