Thread Gibt es ein Modul, um einfach mit verschachtelten Listen zu arbeiten? (3 answers)
Opened by xubaso at 2009-06-27 23:31

neniro
 2009-06-28 10:44
#122692 #122692
User since
2008-12-14
79 Artikel
BenutzerIn
[default_avatar]
Wenn eine zusammengesetzte Datenstruktur zu komplex im Handling wird (z.B.: AoHoAo....), dann ist es meist geschickter auf Objekte auszuweichen. Selbst komplexe zusammengesetzte Strukturen lassen sich so relativ einfach handhaben. Ohne OOP ist oft Rekursion ein guter Weg.

Mal ein Beispiel zum Arbeiten mit Baumstrukturen:
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

package LispTree;
use Moose;
# with 'RoleDigraph';
use overload '""' => \&to_s;

has 'op'    => ( is => 'ro' );
has 'l'     => ( is => 'rw' );
has 'r'     => ( is => 'rw' );

my $operations = {
    '*' => sub { $_[0] * $_[1] },
    '+' => sub { $_[0] + $_[1] },
    '/' => sub { $_[0] / $_[1] },
    '-' => sub { $_[0] - $_[1] },
};

sub to_s {
    my $self = shift;
    my $o  = '(' . $self->op . ' ';
       $o .= blessed $self->l ? $self->{l}->to_s : $self->l;
       $o .= ' ';             
       $o .= blessed $self->r ? $self->{r}->to_s : $self->r;
       $o .= ')';             
    return $o;                
}                             
                              
sub to_rpn {                  
    my $self = shift;         
    my $o  = blessed $self->l ? $self->{l}->to_rpn : $self->l;
       $o .= ' ';             
       $o .= blessed $self->r ? $self->{r}->to_rpn : $self->r;
       $o .= ' ' . $self->op;
    return $o;
}

sub calc {
    my $self = shift;
    my $l = blessed $self->l ? $self->{l}->calc : $self->l;
    my $r = blessed $self->r ? $self->{r}->calc : $self->r;
    return $operations->{$self->op}->( $l, $r );
}

package main;

my $root = LispTree->new( op => '+' );
$root->l(LispTree->new( op => '+', l => 6, r => 6 ));

my $leaf = LispTree->new( op => '*', l => 15, r => 2 ); 
$root->r($leaf);

print $root . "\n" x 2 . $root->to_rpn . "\n" . $root->calc . "\n";

Last edited: 2009-06-28 10:51:55 +0200 (CEST)
-- yet another amateur perl hacker

View full thread Gibt es ein Modul, um einfach mit verschachtelten Listen zu arbeiten?