Thread Umgang mit referenzierten Arrays: Schön schreiben No. 2 (8 answers)
Opened by Sven_123 at 2011-09-30 11:50

rosti
 2011-09-30 17:40
#152815 #152815
User since
2011-03-19
3267 Artikel
BenutzerIn
[Homepage]
user image
Moritz Vorschlag ist doch gut. Warum ein Array extra führen? Das ist in einem Hash genausogut aufgehoben.

Mein ergänzender Vorschlag dazu (falls das Moritz nicht schon geschrieben hat): Schreibe eine Klasse zum entsprechenden Dateityp. Das gibt eine Datenstruktur, die rein- oder rauskommt. Deine Anwendung jedoch, die greift NICHT in die Datenstruktur, die ruft NUR Methoden auf.

Weil: Falls sich mal an der Datenstruktur was ändert, muss das nur in der Klasse gemacht werden.

Dein Array kriegt ganz einfach eine Methode, welche das Array zurückgibt (oder eine Array-Referenz). Dann könnte es noch Methoden geben wie insert, update, delete. Jow, beim Hash geht das delete besonders schön ;)

Die letzte zu schreibende Methode heißt $myObject->store und schreibt den ganzen Kram zurück in die Datei.

Schleife im Objekt das Handle mit und auch den Dateinamen, das hilft beim Debuggen solcher Sachen. Übergeben bei der Objekterstellung die Möglichkeit zum flock() und prüfe, ob ein Lock gesetzt werden konnte. Alles schön in Attribute schreiben.

Code (perl): (dl )
1
2
3
use strict;
use warnings;
use Carp;


.. und alles wird gut ;)

Viel Spaß dabei!

PS: use IO::File;


Nochn Beispiel für weitere Entwicklungen. Gerne würde ich Dir das Modul mal eben komplett schreiben, es macht doch Spaß!

Aber machs mal selber ;)

Hier Dein Einstieg:
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
use Storable qw(freeze thaw);
# example of data structure
my $r = {
        ARRAY => [localtime],
        HASH  => \%ENV,
};

# hier die Möglichkeiten zum Speichern in einer Datei
# Herzstück ist freeze() und thaw()
# mit IO::File dann weitermachen....
my $bin = freeze $r; # Serialize
my $rep = thaw $bin; # Deserialize
# test it
#print dump $rep;

# Entwicklung in Richtung Klasse
# Zum testen wird das Objekt hier zu einer Instanz der main-Class gemacht
bless $r, __PACKAGE__; # main-Class

# damit kann nun eine Methode aufgerufen werden
$r->printarray;

sub printarray{
        my $self = shift; # extrahiere Instanz
        foreach my $e( @{$self->{ARRAY}} ){
                print "$e\n",
        }
        return $self->{ARRAY}; # falls wir das Array draußen brauchen
}


Ergo: Überlege Dir eine "schöne" Datenstrukur für das Objekt (die Instanz Deiner Klasse). Dateianbindung: Storable.pm hat neben freeze/thaw auch Methoden, die direkt mit dem Dateihandle umgehen können, das kannst Du vorzüglich nutzen. Das wird auch sehr performant, Du wirst Dich wundern, wie "schön" das dann geht ;)

IO::File importiert auch die Flags (Konstanten) welche den Modus des FH bestimmen, z.B. O_CREAT|O_BINARY|O_RDWR. Weitere Konstanten importiert Fcntl.pm.

use Fcntl qw(:DEFAULT :flock); # falls Du FH locken musst

Wobei :DEFAULT bereits von IO:File importiert wird.
Last edited: 2011-10-01 10:09:43 +0200 (CEST)

View full thread Umgang mit referenzierten Arrays: Schön schreiben No. 2