Thread rekursive subroutine
(11 answers)
Opened by kimmy at 2014-02-06 14:52
Ich glaub man kann das verständlicher schreiben
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 use strict; use warnings; use feature 'say'; my %nodes = (); for my $line (<DATA>) { 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] Last edited: 2014-02-06 16:21:50 +0100 (CET) 1 + 1 = 10
|