Mir war mal Data::Dumper zu langsam und ich habe mir was zusammengschrieben, das recht schnell ist, hat aber ein paar Einschränkungen. Nur Hashes, Arrays und Skalare werden serialisiert, nichts sonst, Zahlen werden zu Strings, Hashnamen und Strings dürfen kein ' enthalten, das könnte beim entpacken Probleme machen.
Der Output ist recht kompackt.
Es ist klein!
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
package Mydumper;
use strict;
use warnings;
sub dumper($)
{
our sub rc($)
{
my $ref=shift(@_);
my $ref_n=ref($ref);
my $data='';
my $l;
if($ref_n)
{
if($ref_n eq 'HASH')
{
$data='{';
while (@_=each(%$ref))
{
$l=&rc($_[1]);
$data.='\''.$_[0].'\''.$l if($l);
}
$data.='}';
}
elsif($ref_n eq 'ARRAY')
{
$data='[';
$data.=&rc($_) for(@$ref);
$data.=']';
}
}
else
{ $data='\''.$ref.'\''; }
return $data;
}
return rc(shift(@_));
}
sub undumper($)
{
our $data=shift(@_);
our sub rcu()
{
my $ref;
if(index($data,'\'')!=0)
{
$data=~s/^.*?(\[|\{)//s;
my $z=$1;
if($z eq '{')
{
$ref={};
while(index($data,'}')!=0)
{
$data=~s/^'(.+?)'//s;
my $n=$1;
$ref->{$n}=&rcu();
}
$data=~s/^}//;
}
elsif($z eq '[')
{
$ref=[];
push(@$ref,&rcu()) while(index($data,']')!=0);
$data=~s/^]//;
}
}
else
{ $data=~s/^'(.*?)'//s; $ref=$1; }
return $ref;
}
return &rcu();
}
1;
Edit: Einrückungen korrigiert....\n\n
<!--EDIT|topeg|1163807733-->