#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @var = ( ['Hund/Katze/Maus', 10], ['Hund/Katze/Igel', 9], ['Hund/Katze/Hase', 8], ['Wolf/Katze/Maus', 7], ['Wolf/Katze/Igel', 6], ['Wolf/Katze/Hase', 5], ['Hund/Tiger/Maus', 4], ['Hund/Tiger/Igel', 3], ['Hund/Tiger/Hase', 2], ['Wolf/Tiger/Maus', 1], ); my $hashref = {}; my $deep=[]; add($hashref,[split('/',$_->[0])],$_->[1]) for(@var); print Dumper($hashref); my $summe=0; traverse($hashref,sub{ $summe+=shift()}); print "Summe = $summe\n"; $summe=0; traverse($hashref->{Hund},sub{ $summe+=shift()}); print "Summe{Hund} = $summe\n"; for my $pos (0..3) { my $summe=0; print "Summen POS($pos) = \n"; traverse_deep( $hashref, sub{ $summe=0; print " Path: ".join('/',@{$_[1]})." = "; 1}, sub{ $summe+=shift() }, sub{ print "$summe\n"; }, $pos, ); print "\n"; } ######################################################## sub add { my $tmp = \shift(); $tmp=\$$tmp->{$_} for(@{shift()||[]}); $$tmp=shift(); } sub traverse_deep { my $tree=shift; my $cmd_start=shift || sub{}; my $cmd_run=shift || sub{}; my $cmd_end=shift || sub{}; my $deep=shift || 0; my $path=shift || []; if($deep && $tree && ref($tree) eq 'HASH') { for(keys(%$tree)) { traverse_deep( $tree->{$_}, $cmd_start, $cmd_run, $cmd_end, $deep-1, [@$path,$_], ); } } elsif($cmd_start->($tree,$path)) { traverse($tree,$cmd_run); $cmd_end->($tree,$path); } } sub traverse { my $tree=shift; my $cmd=shift || sub{}; if($tree && ref($tree) eq 'HASH') { traverse($_,$cmd) for(values(%$tree)); } else { $cmd->($tree); } }