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