#! /usr/bin/perl use strict; use warnings; my %data; while ( my $line = ) { # skip empty or commented lines next if $line =~ m/^\s*($|#)/; chomp $line; my ( $key, @values ) = split m/\s*[:,]\s*/, $line; # resolve references to previously defined keys (and delete those when resolving) @values = sort map { m/[\d+]/ && exists $data{$_} ? @{delete $data{$_}} : $_ } @values; $data{$key} = \@values; } # check result for my $k ( sort keys %data ) { local $" = ", "; print "$k: @{$data{$k}}\n"; } # RESULT: # [9]: a, b, c, d, e, f, g, h, i, j __DATA__ # [x] : Knoten || a, b : Blaetter # - ein Knoten wird nur ein einziges Mal referenziert # - ein Knoten referenziert nur einen anderen Knoten, der zuvor definiert wurde # - wird ein Knoten referenziert, wird diese Referenz aufgelöst und durch die Blaetter ersetzt [1]: a, b [2]: c, [1] [3]: d, e [4]: f, [3] [5]: g, h [6]: i, [5] [7]: [2], [4] [8]: j, [6] [9]: [7], [8]