http://doku.baseportal.de/564.html#0
1
2
3
4
String found where operator expected at code.pl line 17, near "get "/home/mika/.dir/file.htx""
(Do you need to predeclare get?)
syntax error at code.pl line 17, near "get "/home/mika/.dir/file.htx""
Execution of code.pl aborted due to compilation errors.
2012-03-03T13:55:53 mikaWenn du von dieser Webseite zurück auf die Startseite gehst, siehst du gleich obenauf der Suche zum Title bin ich auf folgende Notiz im Netz gestoßen:
http://doku.baseportal.de/564.html#0
Das fängt mir aber zu früh an. Da scheint noch ein Modul zu fehlen oder die Syntax ist falsch.
QuoteWas ist baseportal?
Erstellen Sie in wenigen Minuten Ihre eigene Web-Datenbank - einfach, schnell und völlig kostenlos!
2012-03-03T13:55:53 mikaWas ich halt will ist, einen Hash in eine Datei speichern und wieder einlesen. Ob nun binär oder als Perl-Code ist mir dabei egal.
1 2 3 4 5 6 7 8 9 10 11 12
#!/usr/bin/perl use warnings; use strict; use YAML; my %hash = (name => "Ken", age => 30); my $hashref = \%hash; print Dump($hashref);
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
#!/usr/bin/perl use warnings; use strict; use YAML; # hash to YAML: my %hash = (name => "Ken", age => 30); my $hashref = \%hash; my $dumpstring = Dump($hashref); # Write YAML-file: open(FH, ">storehash.txt") or die; print FH $dumpstring; close(FH); # Read YAML-file: open(FH, "<storehash.txt") or die; my @a = <FH>; close(FH); my $b = join("\n", @a); # YAML to hash: my $hr = Load($b); my %newhash = %{$hr}; foreach my $i (keys %newhash) { print "$i => $newhash{$i}\n"; }
1
2
3
%hash;
@liste = ("Zeichenkette", "und noch eine", "...");
${hash{"./liste/1"}} = @liste; # usw.
Quote@rosti (Stichwort: Serialize-Algorithmen): Du schlägst also vor das ich "Marker setze" anhand derer ich beim einlesen wieder erkenne wann eine Liste und dann die einzelnen Werte anfangen/aufhören und dies dann Byte-weise abspeichere. Verstehe ich das richtig?
1 2
use bytes; # wichtig für length() $handle->print(pack("N", length($_)).$_) for @liste;
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
######################################################################## sub savehash { ######################################################################## my $hash = shift; my $path = shift; my $fh = new IO::Zlib; $fh->open ($path, "wb") or die $path . ": $!\n"; my $cnt; $cnt = keys %{$hash}; syswrite $fh, sprintf ("%03d", $cnt), 3; while (my ($id, $entrylist) = each %{$hash}){ syswrite $fh, sprintf ("%03d", length($id)), 3; syswrite $fh, $id, length($id); $cnt = @{$entrylist}; syswrite $fh, sprintf ("%03d", $cnt), 3; foreach my $entry (@{$entrylist}) { syswrite $fh, sprintf "%03d", length $entry, 3; syswrite $fh, $entry, length($entry); } } } ######################################################################## sub loadhash { ######################################################################## my $hash = shift; my $path = shift; my $fh = new IO::Zlib; $fh->open($path, "rb") or die $path . ": $!\n"; my ($cnt, $len); sysread $fh, $cnt, 3; for (my $fidcnt = $cnt; $idcnt > 0; $idcnt--) { my $id; sysread $fh, $len, 3; sysread $fh, $id, $len; sysread $fh, $cnt, 3; for (my $entrycnt = $cnt; $entrycnt > 0; $entrycnt--) { my $entry; sysread $fh, $len, 3; sysread $fh, $entry, $len; push @{$hash->{$id}}, $entry; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Storable qw(store retrieve);
my $path = "/tmp/file";
my %hash = (name => "Mika",
age => 30); # <-- fest-codierte Werte!
my $hash = ( -r $path)? retrieve($path) : \%hash;
# Beweist nur etwas wenn man im 2. Durchlauf
# die fest-codierten Werte ändert!
print Dumper($hash);
store ($hash, $path);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Storable qw(store_fd fd_retrieve); use IO::Zlib; my $path = "/tmp/file"; my %hash = (name => "Mika", age => 30); # <-- fest-codierte Werte! my $hash = ( -r $path)? fd_retrieve(IO::Zlib->new($path, "rb")) : \%hash; print Dumper($hash); # neues zufälliges wertepaar $hash->{join('',map{chr(int(rand(25))+65)}(1..4))}=int(rand(50)); store_fd ($hash, IO::Zlib->new($path, "wb"));