Schrift
[thread]8687[/thread]

Daten speichern in best. Datenstruktur: Aber wie? (Seite 2)

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
bloonix
 2007-01-27 16:21
#73723 #73723
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=renee,27.01.2007, 15:15](oder alternativ quote von CPAN:DBI verwenden)[/quote]
Hab ich das vergessen? Das ist natürlich richtig! Mea culpa! :)

@Kalmuecke, wenn du drum herum noch ein wenig mit CPAN:CGI und CPAN:HTML::Template
machst, hast du sogar die richtige Struktur für deinen HTML-Output.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Ronnie
 2007-01-27 18:42
#73724 #73724
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
ein wenig OO macht es leicht die benötigte Funktionalität hinzuzufügen: HTML zu erzeugen, oder zu sortieren etc.
Hier ein kleines Beispiel noch ohne Templating und ohne Sortierung, aber mit einem vernünftigen Grundgerüst:
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
#!/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;
}

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;
bloonix
 2007-01-28 01:04
#73725 #73725
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hmm... und wie sieht es mit Änderungen aus? Kunden und oder
Datensätze hinzufügen, löschen oder ändern? Müsste man dann nicht für
jede schreibende Aktion die gesamte Datei einlesen und neu schreiben?

Dann kommt noch hinzu, dass man vielleicht nur einen einzigen
Datensatz benötigt oder nur einen Kunden. Je nach Größe der Datei wäre
dann sowas wie ein Index wünschenswert.

Ich weiß nicht so recht, was Kalmuecke da machen möchte, aber es wenn
es in solch eine Richtung geht, dann wäre eine Datenbank zu empfehlen.
Der ganze Datenbank-Foo (Indizes, Locking, Transaktionssicherheit) wäre
dann das Richtige.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
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-->
Kalmuecke
 2007-01-29 10:36
#73727 #73727
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Quote
Du hinterlegst ja auch immer wieder die gleiche Addresse, benutz doch einfach [@kundenMesArray].


genau das war mein "verdammter" Fehler, den ich am Freitagabend erst um 18:30h gefunden habe! Danach ging bzw. geht bis jetzt alles, wie ich es mir vorstelle.

Danke auch für die unzähligen Tipps!! Werde mir die ein oder andere Sache mit den HTML-Templates noch mal ansehen um zu sehen ob ich da dann nicht noch einfach meine HTML-Datei erzeugen kann. Bislang schreibe ich das halt einfach selbst "hardcoded" in eine HTML-Datei! Macht die Sache allerdings nicht unbedingt übersichtlich im Perl-Code.

Eine Datenbank kann ich nicht benutzen! Es geht nur mit Dateien!

Aber trotzdem dank an euch alle! Ein super Forum wo man noch Hilfe bekommt, ohne ständig die Laberei zu hören: Benutz mal die Hilfe oder so!
Ihr seit echt spitze! :):):)


Ps.: Wieso werden eigentlich die Anzahl meiner Postings nicht neben meinem Namen angezeigt???
renee
 2007-01-29 10:41
#73728 #73728
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Kalmuecke,29.01.2007, 09:36][...]

Ps.: Wieso werden eigentlich die Anzahl meiner Postings nicht neben meinem Namen angezeigt???[/quote]
Weil das Ikonboard einige Macken hat. Woran es liegt, dass bei einigen Usern die Beiträge nicht mitgezählt werden, kann ich nicht sagen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-01-29 10:48
#73729 #73729
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Kalmuecke,29.01.2007, 09:36]Aber trotzdem dank an euch alle! Ein super Forum wo man noch Hilfe bekommt, ohne ständig die Laberei zu hören: Benutz mal die Hilfe oder so!
Ihr seit echt spitze! :):):)
[/quote]
Nun ja, sowas habe ich auch über ein Jahr im Selfhtml-Forum zu hören
bekommen... das war auschlaggebend genug, mir ein anderes Forum zu
suchen. Jetzt bin ich hier. Willkommen im Club. :)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Kalmuecke
 2007-01-29 11:04
#73730 #73730
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
[quote=opi,29.01.2007, 09:48][quote=Kalmuecke,29.01.2007, 09:36]Aber trotzdem dank an euch alle! Ein super Forum wo man noch Hilfe bekommt, ohne ständig die Laberei zu hören: Benutz mal die Hilfe oder so!
Ihr seit echt spitze! :):):)
[/quote]
Nun ja, sowas habe ich auch über ein Jahr im Selfhtml-Forum zu hören
bekommen... das war auschlaggebend genug, mir ein anderes Forum zu
suchen. Jetzt bin ich hier. Willkommen im Club. :)[/quote]
Du sagst es!

Bin selber im osCommerce Forum unterwegs und suche mir dort öfters mal Hilfe, da ich einen großen Webshop administrieren muss! Und dort ist leider genau das Problem, was ich beschrieben habe!
Man braucht auch nicht mehr zu suchen, weil jeder Thread voll gemüllt ist mit "Benutz die Suche" etc.! Es leidet darunter die Qualität des Forums und der Beiträge. Wenn es jemanden auf den Keks geht, daß z.B. mehrmals das gleiche gefragt wird, dann soll er es einfach nicht mehr lesen! Fertig. Wenn man "Neu-Einsteiger" ist wird man leider zu oft mit Infos erschlagen, was eben halt oft dazuführt, dass Dinge mehrmals erfragt werden!
Kalmuecke
 2007-01-29 17:33
#73731 #73731
User since
2006-10-14
68 Artikel
BenutzerIn
[default_avatar]
Habe nochmals eine Frage und zwar:

ich gehe mit einer Schleife durch ein Hash einmal so:
Code: (dl )
1
2
3
4
5
6
7
while (my ($key, $value) = each(%kundenHash))
{
......
my $cntRef = $anderesHash{$key};
my @cntMsgArray = @$cntMsgRef;
......
}[


und einmal so:

Quote
for (my $f = 0; $f < @fileNames; $f++)
{
......
my $cntRef = $anderesHash{$fileNames[$f]};
my @cntMsgArray = @$cntMsgRef;
......
}


Wenn ich das mache wie im zweiten Quote dann geht es und ich kann auf den Schlüssel des zweiten Hashes zugreifen!
fileNames ist ein Array aus dem ich über den Index einen Namen hole, der genau einem Schlüsselnamen entspricht im hash.

Wenn ich es aber jetzt durch mein Hash gehe und über $key auf den Wert des Schlüssels im zweiten hash zugreifen will geht das nicht. Schlüsselname sind aber gleich!!!

Fehlermeldung bekomme ich diese:
Quote
Can't use an undefined value as an ARRAY reference at


Wieso kann ich nicht mit dem Schlüsselnamen des einen hashes auf den Wert des Schlüssel mit dem gleichen Namen im zweiten Hash zugreifen??

Ps.: Sorry wenn ich es etwas kompliziert erklärt habe!\n\n

<!--EDIT|renee|1170088947-->
renee
 2007-01-29 18:47
#73732 #73732
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dazu solltest Du Dir mal mit CPAN:Data::Dumper den Hash anschauen.

Warum benutzen eigentlich alle die "hässlichen" C-Style-Schleifen?
Code: (dl )
1
2
3
4
5
6
7
for my $key (keys %anderesHash)
{
......
my $cntRef = $anderesHash{$key};
my @cntMsgArray = @$cntMsgRef;
......
}


ist doch schöner als
Code: (dl )
1
2
3
4
5
6
7
for (my $f = 0; $f < @fileNames; $f++)
{
......
my $cntRef = $anderesHash{$fileNames[$f]};
my @cntMsgArray = @$cntMsgRef;
......
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2007-01-26 12:36.