Thread rekursive subroutine (11 answers)
Opened by kimmy at 2014-02-06 14:52

Muffi
 2014-02-06 16:13
#173424 #173424
User since
2012-07-18
1465 Artikel
BenutzerIn
[default_avatar]
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

View full thread rekursive subroutine