#!/usr/bin/perl use strict; use warnings; my %tree=(); my %txt=(); # baum erstellen while(my $line=) { chomp($line); my $text=''; ($line,$text)=$line=~/\s*([^\|]+?)\|(.+?)\s*$/; my @elm=split(/\s+/,$line); $txt{"@elm"}=[split(/\s*\|\s*/,$text)]; my $ref=\\%tree; $ref=\$$ref->{$_} for(@elm); $$ref={} unless($$ref); } # baum darstellen print create(\%tree,\%txt); sub create { my $tree=shift; my $txt=shift; my $deep=shift || ''; my $line=shift || []; my $ret=''; for my $key (sort keys(%$tree)) { my @in=(@$line,$key); my $text=$txt->{"@in"}; $text=[] unless($text); $text=join("--",@$text); my $ref=$tree->{$key}; if(keys(%$ref)) { $ret.=qq($deep+@in ($text) \n); $ret.=create($ref,$txt,"$deep ",\@in); chomp($ret); $ret.="\n"; } else { $ret.="$deep@in ($text)\n"; } } return $ret; } __DATA__ A|text|link|expandet A A|text|link A B|text|link B|text|link|nonexpandet B A|text|link B B|text|link B B A|text