Thread Daten speichern in best. Datenstruktur: Aber wie? (19 answers)
Opened by Kalmuecke at 2007-01-26 12:36

Ronnie
 2007-01-28 01:14
#73726 #73726
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@Opi: Ja, eine Datenbank ist sicher eine gute Idee, wenn die entsprechenden Operationen gehäuft vorkommen. Da aber in dem ersten Post von einem Flatfile die Rede war, habe ich darauf aufgesetzt.

Wenn Datenbank, dann kann man sehr elegant auch ein ORM wie CPAN:DBIx::Class einsetzen. Der Import/Export mit YAML oder mittlerweile eher JSON finde ich trotzdem immer sehr nett.

Das ist das schöne an OO, nach außen bleibt eine Klasse gleich - unter der Haube kann man nahezu beliebig verändern.

EDIT: Hier mal mit find, sort und yaml-Dump:
Code: (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/perl

use strict;
use warnings;

package Customer;
use Moose;

has 'name' => ( is => 'rw' );
has 'attributes' => ( is => 'rw', isa => 'ArrayRef' );

sub to_html_table {
my $self = shift;
my $o = '<table class="customer">' . "\n"
. '<tr><th class="name">'
. $self->name
. '</th></tr>' . "\n";
$o .= '<tr><td class="attribute">'
. $_
. '</td></tr>'
. "\n" for @{$self->attributes};
$o .= '</table>' . "\n" . "\n";
return $o;
}

package CustomerRecord;
use Moose;

has 'customers' => ( is => 'rw', isa => 'ArrayRef' );

sub add_customer {
my $self = shift;
push @{$self->{'customers'}}, shift @_ if @_;
}

sub to_html {
my $self = shift;
my $o;
$o .= $_->to_html_table for @{$self->{'customers'}};
return $o;
}

sub find {
my $self = shift;
my ($i, $k) = @_;
return $self->new(
customers => [ grep { $_->{$i} eq $k } @{$self->customers} ]
);
}

sub sort_in_order {
my $self = shift;
my ($order, $key) = @_;
die "unknown order for sort" unless $order eq 'asc' or $order eq 'desc';

return $self->new(
customers => $order eq 'asc' ?
[sort { $a->{$key} cmp $b->{$key} } @{$self->customers}] :
[sort { $b->{$key} cmp $a->{$key} } @{$self->customers}]
);
}

package main;
use YAML;
use Data::Dumper;

my $ref = [Load(<<'...')];
---
Kundenname: Meyer
Datensatz:
- DatensatzA 1
- DatensatzA 2
- DatensatzA 3
- DatensatzA 4
- DatensatzA 5
- DatensatzA 6
---
Kundenname: Müller
Datensatz:
- DatensatzB 1
- DatensatzB 2
- DatensatzB 3

---
Kundenname: Schulze
Datensatz:
- DatensatzC 1
- DatensatzC 2
- DatensatzC 3
- DatensatzC 4
- DatensatzC 5
- DatensatzC 6
- DatensatzC 7
...

#print Dumper($ref);

my $record = CustomerRecord->new;
$record->add_customer(
Customer->new(
name => $_->{'Kundenname'},
attributes => $_->{'Datensatz'}
)
) for @$ref;

print $record->to_html; # dump all as html
print $record->find(name => 'Müller')->to_html; # dump result as html

print Dump($record->find(name => 'Müller')); # dump to yaml
print Dumper Load (Dump($record->find(name => 'Müller'))); # load from yaml

print Dumper $record->sort_in_order( desc => 'name' ); # dump descending
\n\n

<!--EDIT|Ronnie|1169979738-->

View full thread Daten speichern in best. Datenstruktur: Aber wie?