use strict; use warnings; use feature 'say'; my %nodes = (); for my $line () { my $node = Node->new($line, \%nodes); # funktioniert nur, wenn die nodes, auf die verwiesen wird schon da sind $nodes{$node->id} = $node; } for my $node (values %nodes) { say $node->id.': '.join(', ', $node->elements); } { package Node; sub _node_id { my $node_ref_str = shift; if ($node_ref_str =~ /\[(.+)\]/) { return $1; } else { return undef; } } sub new { my $class = shift; my $str = shift; my $nodes = shift; my ($id, $left_str, $right_str) = $str =~ /\[(\d+)\]: (\[?\w+\]?), (\[?\w+\]?)/; my $left = _node_id($left_str) ? $nodes->{_node_id($left_str)} : $left_str; my $right = _node_id($right_str) ? $nodes->{_node_id($right_str)} : $right_str; my $self = { id => $id, left => $left, right => $right }; bless $self, $class; return $self; } sub id { my $self = shift; return $self->{id}; } sub elements { my $self = shift; my @elements = (); for ('left', 'right') { if ($self->{$_}->isa('Node')) { push @elements, $self->{$_}->elements; } else { push @elements, $self->{$_}; } } return @elements; } } __DATA__ [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]