2019-10-21T05:47:50 rostiDas Zeichenproblem ist keine Begründung.
2019-10-21T05:47:50 rosti
2019-10-21T05:47:50 rostiDas läuft also so ab, daß bei jedem Prozess die ganze Datei gelesen und die Datentruktur im Hauptspeicher wiederhergestellt wird.
2019-10-21T05:47:50 rostiPS: Beschreib mal Dein Zeichenproblem.
2019-10-21T12:12:27 rostiNun, ich verwende einen eigenen Serializer.
2019-10-21T12:12:27 rostiStorable ist im CORE und läuft so auf jeder Plattform. Du solltest jedoch schauen, ob die damit erzeugten Dateien auf unterschiedlichen Plattformen kompatibel sind.
2019-10-21T12:12:27 rostiWenn die Storable Vesionen gleich sind, sind auch die Dateien kompatibel.
2019-10-21T12:12:27 rostiMFG und viel Erfolg!
2019-10-21T12:25:42 rostiÜberlege Dir mal eine geeignete Datenstruktur, Hash of Hashes, Array mit Hashreferenzen ö.ä.
1 2 3 4 5 6 7
aus [{},{},{}] wird { 0 => {}, 1 => {}, 2 => {} } und damit eine EAV Struktur fürs Modul FastEAV.
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
use FastEAV; my $f = FastEAV->new( file => "personen.eav", lock => 1) or die $^E; # Personen in Array my $per = [ {name => 'Hinz', vname=> 'Horst'}, {name => 'Kunz', vname=> 'Erwin'}, {name => 'Huber', vname=> 'Karl-Heinz'}, {name => 'Haar', vname=> 'Franz'} ]; foreach my $e ( 0 .. scalar @$per - 1 ){ # [index] + 1 $f->checkin(1+$e, %{$per->[$e]}); } $f->write; $f = undef; # Personen wiedr auslesen my $dal = FastEAV->new( file => "personen.eav") or die $^E; foreach my $ent( $dal->count){ say Dumper $dal->checkout($ent); } # nun eine Hash Of Hashes my $eav = { 1 => {name => 'Hinz', vname=> 'Horst', plz => 12345}, 2 => {name => 'Kunz', vname=> 'Erwin', plz => 55555}, a => {name => 'Huber', vname=> 'Karl-Heinz', plz => 11011}, b => {name => 'Haar', vname=> 'Franz', ort => 'Erfurt', plz => 99081} }; foreach my $ent ( keys %$eav ){ $dal->checkin($ent, %{$eav->{$ent}} ); } $dal->write; undef $dal; # Kontrolle on alles gespeichert wurde my $fast = FastEAV->new( file => "personen.eav") or die $^E; foreach my $ent( $fast->count){ say Dumper $fast->checkout($ent); } # Ausgabe $VAR1 = { 'name' => 'Haar', 'vname' => 'Franz' }; $VAR1 = { 'name' => 'Hinz', 'vname' => 'Horst' }; $VAR1 = { 'name' => 'Huber', 'plz' => '11011', 'vname' => 'Karl-Heinz' }; $VAR1 = { 'name' => 'Huber', 'vname' => 'Karl-Heinz' }; $VAR1 = { 'name' => 'Haar', 'ort' => 'Erfurt', 'plz' => '99081', 'vname' => 'Franz' }; $VAR1 = { 'name' => 'Kunz', 'vname' => 'Erwin' }; $VAR1 = { 'name' => 'Hinz', 'plz' => '12345', 'vname' => 'Horst' }; $VAR1 = { 'name' => 'Haar', 'vname' => 'Franz' }; $VAR1 = { 'name' => 'Huber', 'plz' => '11011', 'vname' => 'Karl-Heinz' }; $VAR1 = { 'name' => 'Haar', 'ort' => 'Erfurt', 'plz' => '99081', 'vname' => 'Franz' }; $VAR1 = { 'name' => 'Huber', 'vname' => 'Karl-Heinz' }; $VAR1 = { 'name' => 'Kunz', 'plz' => '55555', 'vname' => 'Erwin' };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
use IO::String; my $io = IO::String->new; # Serialize Key Value foreach my $k( keys %ENV){ my $v = $ENV{$k}; $io->print( pack("NN", length $k, length $v).$k.$v ); } # wiederherstellen $io->seek(0,0); my %env = (); while( read($io, my $buffer, 8) ){ my ($klen, $vlen) = unpack "NN", $buffer; read($io, my $key, $klen); read($io, my $val, $vlen); $env{$key} = $val; } print Dumper \%env;
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
#!/usr/bin/perl use strict; use warnings; use Fcntl qw(:DEFAULT :flock); use Data::Dumper; use 5.010; system('cls'); my %struktur = ( 'hash_im_hash' => { 'foo' => 'bar', 'foo2' => 'bar2', }, 'array_im_hash' => [ { 'foo4' => 'bar4', 'foo6' => 'bar6', }, { 'foo8' => 'bar8', 'foo10' => 'bar10', }, ], 'string_im_hash' => 'alfred', ); if (sysopen(my $dateifh,'test_io.txt',O_WRONLY|O_TRUNC|O_CREAT)) { if (binmode($dateifh)) { $Data::Dumper::Terse = 1; print $dateifh Dumper(\%struktur); if (close($dateifh)) { say "Fertig"; } else { die $!; } } else { die $!; } } else { die $!; } if (open(my $fh,'<','test_io.txt')) { my $test = eval do { local $/; <$fh>; }; if ($@) { die $@; } else { if (close($fh)) { say "\n\nGelesen:".Dumper($test); } } }
2019-11-02T14:08:53 rostiMehrfach verschachteln ist keine gute Idee.
2019-11-02T14:08:53 rostiEs ist immer besser mit linearen Strukturen zu arbeiten die keine Rekursion erfordern.
2019-11-02T14:08:53 rostiWozu brauchst Du denn eine nichtlineare Datenstruktur?
2019-11-02T14:08:53 rostiWenn Du mit Datenbanken arbeitest hast Du doch so was auch nicht.
2019-11-02T14:08:53 rostiPS: Wenn Du an eval einen Block übergibst, ist das do überflüssig.
2019-11-10T06:45:56 rostiLiest Du meine Beiträge?
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
use strict; use warnings; sub serialize_array{ my $self = shift; my $aref = shift || []; my $io = shift || *STDOUT; use bytes; foreach my $e(@$aref){ if( defined $e ){ $io->print( pack("N", length $e)."D".$e ); } else{ $io->print( pack("N", 0)."U" ); } } } sub restore_array{ my $self = shift; my $io = shift || *STDIN; my $r = []; while( read($io, my $buf, 4) ){ my $len = unpack "N", $buf; read($io, my $def, 1); # defined//undef read($io, my $e, $len); push @$r, $def eq "D" ? $e : undef; } return $r; } 1;######################################################################### # Tests untenstehend use IO::String; use Data::Dumper; my $io = IO::String->new; my $m = bless{}; $m->serialize_array( [0,'foo','bar','bäh',undef,''], $io ); $io->seek(0,0); my $r = $m->restore_array($io); print Dumper $r;;
2019-11-11T12:52:17 biancaGut und wo finde ich die erzeugte Datendatei nach Ausführung dieses Codes?
2019-10-20T17:55:39 biancaIch bin zwar nicht pq, aber einfache Sachen gehen zuerst:P.S.: pq: wie macht man aktuell Verlinkungen eines Kommandos in die Perldoku? [pod=flock]flock()[/pod] funktioniert nicht so gut.
2019-10-20T17:55:39 biancaHallo!Hat jemand Erfahrungen/Empfehlungen für ein CPAN Modul - sehr gern eines im core was nicht compiliert werden braucht - mit dem man quasi eine Datenbank in einer Datei hat. Ich würde gern etwas selbst gestricktes ersetzen und keine "echte" DB verwenden. Es geht um die Verwendung im privaten Umfeld als Web-/Browseranwendung mit UTF-8 Zeichensatz und CGI-Schnittstelle.
Es sind keine großen Datenmengen. Größte Datei wird voraussichtlich nicht größer als 2 oder 3 MB sein, dafür sind es ein paar mehr Dateien. Einfache Benutzung und sichere Verwendung der Dateien - mit flock() etc. - gehen vor Performance und Speicherbedarf.
2019-10-21T08:36:53 DaximEtwas anderes als SQLite (oder PostgreSQL) käme mir nicht in die Tüte.