#!/usr/bin/perl use strict; use warnings; my %data; # Abhängigkeiten zusammen stellen for my $line () { chomp $line; # Abhängigkeit my ($key, $value) = split /\s*-->\s*/, $line; # Neues Element im hash erzeugen wenn nötig. for my $k ($key, $value){ next if($data{$k}); $data{$k} = { name => $k }; } # Im Kind markieren wer der Vater ist push(@{$data{$value}->{parents}},$key); } #kinder zusammen suchen / Baum erstellen for my $elm (values(%data)) { next unless $elm->{parents}; for my $key (@{$elm->{parents}}) { push( @{$data{$key}->{children}}, $elm ); } } # alle Kinder aus %data entfernen for my $key (keys(%data)) { next unless($data{$key}->{parents}); delete($data{$key}->{parents}); delete($data{$key}); } # Es ist nur noch das "root" Element in %data my $root = (values(%data))[0]; # Den erzeugen Baum anzeigen my @stack = (['', $root ]); while(@stack) { my ($deep,$entry) = @{shift(@stack)}; print "$deep$entry->{name}\n"; for my $next ( sort{ $b->{name} cmp $a->{name} }@{$entry->{children}} ) { unshift(@stack,["$deep ", $next]); } } __DATA__ 1A --> 2A 1A --> 2B 2A --> 4A 2A --> 5A 4A --> 5A 2B --> 3A 3A --> 4A