Encode/IO doc tweaks.
[p5sagit/p5-mst-13.2.git] / ext / Storable / Storable.pm
CommitLineData
8be2b38b 1;# $Id: Storable.pm,v 1.0.1.10 2001/03/15 00:20:25 ram Exp $
7a6a85bf 2;#
3;# Copyright (c) 1995-2000, Raphael Manfredi
4;#
9e21b3d0 5;# You may redistribute only under the same terms as Perl 5, as specified
6;# in the README file that comes with the distribution.
7a6a85bf 7;#
8;# $Log: Storable.pm,v $
8be2b38b 9;# Revision 1.0.1.10 2001/03/15 00:20:25 ram
10;# patch11: updated version number
11;#
12;# Revision 1.0.1.9 2001/02/17 12:37:32 ram
13;# patch10: forgot to increase version number at previous patch
14;#
b12202d0 15;# Revision 1.0.1.8 2001/02/17 12:24:37 ram
16;# patch8: fixed incorrect error message
17;#
862382c7 18;# Revision 1.0.1.7 2001/01/03 09:39:02 ram
19;# patch7: added CAN_FLOCK to determine whether we can flock() or not
20;#
90826881 21;# Revision 1.0.1.6 2000/11/05 17:20:25 ram
22;# patch6: increased version number
23;#
212e9bde 24;# Revision 1.0.1.5 2000/10/26 17:10:18 ram
25;# patch5: documented that store() and retrieve() can return undef
26;# patch5: added paragraph explaining the auto require for thaw hooks
27;#
28;# Revision 1.0.1.4 2000/10/23 18:02:57 ram
29;# patch4: protected calls to flock() for dos platform
30;# patch4: added logcarp emulation if they don't have Log::Agent
31;#
8be2b38b 32;# Revision 1.0.1.3 2000/09/29 19:49:01 ram
33;# patch3: updated version number
34;#
35;# Revision 1.0.1.2 2000/09/28 21:42:51 ram
36;# patch2: added lock_store lock_nstore lock_retrieve
37;#
38;# Revision 1.0.1.1 2000/09/17 16:46:21 ram
39;# patch1: documented that doubles are stringified by nstore()
40;# patch1: added Salvador Ortiz Garcia in CREDITS section
41;#
9e21b3d0 42;# Revision 1.0 2000/09/01 19:40:41 ram
43;# Baseline for first official release.
7a6a85bf 44;#
45
46require DynaLoader;
47require Exporter;
48package Storable; @ISA = qw(Exporter DynaLoader);
49
50@EXPORT = qw(store retrieve);
51@EXPORT_OK = qw(
9e21b3d0 52 nstore store_fd nstore_fd fd_retrieve
7a6a85bf 53 freeze nfreeze thaw
54 dclone
9e21b3d0 55 retrieve_fd
dd19458b 56 lock_store lock_nstore lock_retrieve
7a6a85bf 57);
58
59use AutoLoader;
60use vars qw($forgive_me $VERSION);
61
8be2b38b 62$VERSION = '1.011';
7a6a85bf 63*AUTOLOAD = \&AutoLoader::AUTOLOAD; # Grrr...
64
65#
66# Use of Log::Agent is optional
67#
68
69eval "use Log::Agent";
70
71unless (defined @Log::Agent::EXPORT) {
72 eval q{
73 sub logcroak {
74 require Carp;
75 Carp::croak(@_);
76 }
b29b780f 77 sub logcarp {
78 require Carp;
79 Carp::carp(@_);
80 }
7a6a85bf 81 };
82}
83
dd19458b 84#
85# They might miss :flock in Fcntl
86#
87
88BEGIN {
89 require Fcntl;
90 if (exists $Fcntl::EXPORT_TAGS{'flock'}) {
91 Fcntl->import(':flock');
92 } else {
93 eval q{
94 sub LOCK_SH () {1}
95 sub LOCK_EX () {2}
96 };
97 }
98}
99
7a6a85bf 100sub logcroak;
b29b780f 101sub logcarp;
7a6a85bf 102
9e21b3d0 103sub retrieve_fd { &fd_retrieve } # Backward compatibility
cb3d9de5 104
862382c7 105#
106# Determine whether locking is possible, but only when needed.
107#
108
109my $CAN_FLOCK;
110
111sub CAN_FLOCK {
112 return $CAN_FLOCK if defined $CAN_FLOCK;
113 require Config; import Config;
114 return $CAN_FLOCK =
115 $Config{'d_flock'} ||
116 $Config{'d_fcntl_can_lock'} ||
117 $Config{'d_lockf'};
118}
119
7a6a85bf 120bootstrap Storable;
1211;
122__END__
123
124#
125# store
126#
127# Store target object hierarchy, identified by a reference to its root.
128# The stored object tree may later be retrieved to memory via retrieve.
129# Returns undef if an I/O error occurred, in which case the file is
130# removed.
131#
132sub store {
dd19458b 133 return _store(\&pstore, @_, 0);
7a6a85bf 134}
135
136#
137# nstore
138#
139# Same as store, but in network order.
140#
141sub nstore {
dd19458b 142 return _store(\&net_pstore, @_, 0);
143}
144
145#
146# lock_store
147#
148# Same as store, but flock the file first (advisory locking).
149#
150sub lock_store {
151 return _store(\&pstore, @_, 1);
152}
153
154#
155# lock_nstore
156#
157# Same as nstore, but flock the file first (advisory locking).
158#
159sub lock_nstore {
160 return _store(\&net_pstore, @_, 1);
7a6a85bf 161}
162
163# Internal store to file routine
164sub _store {
165 my $xsptr = shift;
166 my $self = shift;
dd19458b 167 my ($file, $use_locking) = @_;
7a6a85bf 168 logcroak "not a reference" unless ref($self);
b12202d0 169 logcroak "wrong argument number" unless @_ == 2; # No @foo in arglist
7a6a85bf 170 local *FILE;
171 open(FILE, ">$file") || logcroak "can't create $file: $!";
172 binmode FILE; # Archaic systems...
dd19458b 173 if ($use_locking) {
862382c7 174 unless (&CAN_FLOCK) {
b29b780f 175 logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
176 return undef;
f567092b 177 }
dd19458b 178 flock(FILE, LOCK_EX) ||
179 logcroak "can't get exclusive lock on $file: $!";
180 truncate FILE, 0;
181 # Unlocking will happen when FILE is closed
182 }
7a6a85bf 183 my $da = $@; # Don't mess if called from exception handler
184 my $ret;
185 # Call C routine nstore or pstore, depending on network order
186 eval { $ret = &$xsptr(*FILE, $self) };
187 close(FILE) or $ret = undef;
188 unlink($file) or warn "Can't unlink $file: $!\n" if $@ || !defined $ret;
189 logcroak $@ if $@ =~ s/\.?\n$/,/;
190 $@ = $da;
191 return $ret ? $ret : undef;
192}
193
194#
195# store_fd
196#
197# Same as store, but perform on an already opened file descriptor instead.
198# Returns undef if an I/O error occurred.
199#
200sub store_fd {
201 return _store_fd(\&pstore, @_);
202}
203
204#
205# nstore_fd
206#
207# Same as store_fd, but in network order.
208#
209sub nstore_fd {
210 my ($self, $file) = @_;
211 return _store_fd(\&net_pstore, @_);
212}
213
214# Internal store routine on opened file descriptor
215sub _store_fd {
216 my $xsptr = shift;
217 my $self = shift;
218 my ($file) = @_;
219 logcroak "not a reference" unless ref($self);
220 logcroak "too many arguments" unless @_ == 1; # No @foo in arglist
221 my $fd = fileno($file);
222 logcroak "not a valid file descriptor" unless defined $fd;
223 my $da = $@; # Don't mess if called from exception handler
224 my $ret;
225 # Call C routine nstore or pstore, depending on network order
226 eval { $ret = &$xsptr($file, $self) };
227 logcroak $@ if $@ =~ s/\.?\n$/,/;
228 $@ = $da;
229 return $ret ? $ret : undef;
230}
231
232#
233# freeze
234#
235# Store oject and its hierarchy in memory and return a scalar
236# containing the result.
237#
238sub freeze {
239 _freeze(\&mstore, @_);
240}
241
242#
243# nfreeze
244#
245# Same as freeze but in network order.
246#
247sub nfreeze {
248 _freeze(\&net_mstore, @_);
249}
250
251# Internal freeze routine
252sub _freeze {
253 my $xsptr = shift;
254 my $self = shift;
255 logcroak "not a reference" unless ref($self);
256 logcroak "too many arguments" unless @_ == 0; # No @foo in arglist
257 my $da = $@; # Don't mess if called from exception handler
258 my $ret;
259 # Call C routine mstore or net_mstore, depending on network order
260 eval { $ret = &$xsptr($self) };
261 logcroak $@ if $@ =~ s/\.?\n$/,/;
262 $@ = $da;
263 return $ret ? $ret : undef;
264}
265
266#
267# retrieve
268#
269# Retrieve object hierarchy from disk, returning a reference to the root
270# object of that tree.
271#
272sub retrieve {
dd19458b 273 _retrieve($_[0], 0);
274}
275
276#
277# lock_retrieve
278#
279# Same as retrieve, but with advisory locking.
280#
281sub lock_retrieve {
282 _retrieve($_[0], 1);
283}
284
285# Internal retrieve routine
286sub _retrieve {
287 my ($file, $use_locking) = @_;
7a6a85bf 288 local *FILE;
dd19458b 289 open(FILE, $file) || logcroak "can't open $file: $!";
7a6a85bf 290 binmode FILE; # Archaic systems...
291 my $self;
292 my $da = $@; # Could be from exception handler
dd19458b 293 if ($use_locking) {
862382c7 294 unless (&CAN_FLOCK) {
8be2b38b 295 logcarp "Storable::lock_store: fcntl/flock emulation broken on $^O";
b29b780f 296 return undef;
297 }
8be2b38b 298 flock(FILE, LOCK_SH) || logcroak "can't get shared lock on $file: $!";
dd19458b 299 # Unlocking will happen when FILE is closed
300 }
7a6a85bf 301 eval { $self = pretrieve(*FILE) }; # Call C routine
302 close(FILE);
303 logcroak $@ if $@ =~ s/\.?\n$/,/;
304 $@ = $da;
305 return $self;
306}
307
308#
9e21b3d0 309# fd_retrieve
7a6a85bf 310#
311# Same as retrieve, but perform from an already opened file descriptor instead.
312#
9e21b3d0 313sub fd_retrieve {
7a6a85bf 314 my ($file) = @_;
315 my $fd = fileno($file);
316 logcroak "not a valid file descriptor" unless defined $fd;
317 my $self;
318 my $da = $@; # Could be from exception handler
319 eval { $self = pretrieve($file) }; # Call C routine
320 logcroak $@ if $@ =~ s/\.?\n$/,/;
321 $@ = $da;
322 return $self;
323}
324
325#
326# thaw
327#
328# Recreate objects in memory from an existing frozen image created
329# by freeze. If the frozen image passed is undef, return undef.
330#
331sub thaw {
332 my ($frozen) = @_;
333 return undef unless defined $frozen;
334 my $self;
335 my $da = $@; # Could be from exception handler
336 eval { $self = mretrieve($frozen) }; # Call C routine
337 logcroak $@ if $@ =~ s/\.?\n$/,/;
338 $@ = $da;
339 return $self;
340}
341
342=head1 NAME
343
344Storable - persistency for perl data structures
345
346=head1 SYNOPSIS
347
348 use Storable;
349 store \%table, 'file';
350 $hashref = retrieve('file');
351
352 use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);
353
354 # Network order
355 nstore \%table, 'file';
356 $hashref = retrieve('file'); # There is NO nretrieve()
357
358 # Storing to and retrieving from an already opened file
359 store_fd \@array, \*STDOUT;
360 nstore_fd \%table, \*STDOUT;
9e21b3d0 361 $aryref = fd_retrieve(\*SOCKET);
362 $hashref = fd_retrieve(\*SOCKET);
7a6a85bf 363
364 # Serializing to memory
365 $serialized = freeze \%table;
366 %table_clone = %{ thaw($serialized) };
367
368 # Deep (recursive) cloning
369 $cloneref = dclone($ref);
370
dd19458b 371 # Advisory locking
372 use Storable qw(lock_store lock_nstore lock_retrieve)
373 lock_store \%table, 'file';
374 lock_nstore \%table, 'file';
375 $hashref = lock_retrieve('file');
376
7a6a85bf 377=head1 DESCRIPTION
378
379The Storable package brings persistency to your perl data structures
380containing SCALAR, ARRAY, HASH or REF objects, i.e. anything that can be
381convenientely stored to disk and retrieved at a later time.
382
383It can be used in the regular procedural way by calling C<store> with
384a reference to the object to be stored, along with the file name where
385the image should be written.
386The routine returns C<undef> for I/O problems or other internal error,
387a true value otherwise. Serious errors are propagated as a C<die> exception.
388
389To retrieve data stored to disk, use C<retrieve> with a file name,
390and the objects stored into that file are recreated into memory for you,
391a I<reference> to the root object being returned. In case an I/O error
392occurs while reading, C<undef> is returned instead. Other serious
393errors are propagated via C<die>.
394
395Since storage is performed recursively, you might want to stuff references
396to objects that share a lot of common data into a single array or hash
397table, and then store that object. That way, when you retrieve back the
398whole thing, the objects will continue to share what they originally shared.
399
400At the cost of a slight header overhead, you may store to an already
401opened file descriptor using the C<store_fd> routine, and retrieve
9e21b3d0 402from a file via C<fd_retrieve>. Those names aren't imported by default,
7a6a85bf 403so you will have to do that explicitely if you need those routines.
404The file descriptor you supply must be already opened, for read
405if you're going to retrieve and for write if you wish to store.
406
407 store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
9e21b3d0 408 $hashref = fd_retrieve(*STDIN);
7a6a85bf 409
410You can also store data in network order to allow easy sharing across
411multiple platforms, or when storing on a socket known to be remotely
412connected. The routines to call have an initial C<n> prefix for I<network>,
413as in C<nstore> and C<nstore_fd>. At retrieval time, your data will be
414correctly restored so you don't have to know whether you're restoring
dd19458b 415from native or network ordered data. Double values are stored stringified
416to ensure portability as well, at the slight risk of loosing some precision
417in the last decimals.
7a6a85bf 418
9e21b3d0 419When using C<fd_retrieve>, objects are retrieved in sequence, one
7a6a85bf 420object (i.e. one recursive tree) per associated C<store_fd>.
421
422If you're more from the object-oriented camp, you can inherit from
423Storable and directly store your objects by invoking C<store> as
424a method. The fact that the root of the to-be-stored tree is a
425blessed reference (i.e. an object) is special-cased so that the
426retrieve does not provide a reference to that object but rather the
427blessed object reference itself. (Otherwise, you'd get a reference
428to that blessed object).
429
430=head1 MEMORY STORE
431
432The Storable engine can also store data into a Perl scalar instead, to
433later retrieve them. This is mainly used to freeze a complex structure in
434some safe compact memory place (where it can possibly be sent to another
435process via some IPC, since freezing the structure also serializes it in
436effect). Later on, and maybe somewhere else, you can thaw the Perl scalar
437out and recreate the original complex structure in memory.
438
439Surprisingly, the routines to be called are named C<freeze> and C<thaw>.
440If you wish to send out the frozen scalar to another machine, use
441C<nfreeze> instead to get a portable image.
442
443Note that freezing an object structure and immediately thawing it
444actually achieves a deep cloning of that structure:
445
446 dclone(.) = thaw(freeze(.))
447
448Storable provides you with a C<dclone> interface which does not create
449that intermediary scalar but instead freezes the structure in some
450internal memory space and then immediatly thaws it out.
451
dd19458b 452=head1 ADVISORY LOCKING
453
454The C<lock_store> and C<lock_nstore> routine are equivalent to C<store>
455and C<nstore>, only they get an exclusive lock on the file before
456writing. Likewise, C<lock_retrieve> performs as C<retrieve>, but also
457gets a shared lock on the file before reading.
458
459Like with any advisory locking scheme, the protection only works if
460you systematically use C<lock_store> and C<lock_retrieve>. If one
461side of your application uses C<store> whilst the other uses C<lock_retrieve>,
462you will get no protection at all.
463
464The internal advisory locking is implemented using Perl's flock() routine.
465If your system does not support any form of flock(), or if you share
466your files across NFS, you might wish to use other forms of locking by
467using modules like LockFile::Simple which lock a file using a filesystem
468entry, instead of locking the file descriptor.
469
7a6a85bf 470=head1 SPEED
471
472The heart of Storable is written in C for decent speed. Extra low-level
473optimization have been made when manipulating perl internals, to
474sacrifice encapsulation for the benefit of a greater speed.
475
476=head1 CANONICAL REPRESENTATION
477
478Normally Storable stores elements of hashes in the order they are
479stored internally by Perl, i.e. pseudo-randomly. If you set
480C<$Storable::canonical> to some C<TRUE> value, Storable will store
481hashes with the elements sorted by their key. This allows you to
482compare data structures by comparing their frozen representations (or
483even the compressed frozen representations), which can be useful for
484creating lookup tables for complicated queries.
485
486Canonical order does not imply network order, those are two orthogonal
487settings.
488
489=head1 ERROR REPORTING
490
491Storable uses the "exception" paradigm, in that it does not try to workaround
492failures: if something bad happens, an exception is generated from the
493caller's perspective (see L<Carp> and C<croak()>). Use eval {} to trap
494those exceptions.
495
496When Storable croaks, it tries to report the error via the C<logcroak()>
497routine from the C<Log::Agent> package, if it is available.
498
212e9bde 499Normal errors are reported by having store() or retrieve() return C<undef>.
500Such errors are usually I/O errors (or truncated stream errors at retrieval).
501
7a6a85bf 502=head1 WIZARDS ONLY
503
504=head2 Hooks
505
506Any class may define hooks that will be called during the serialization
507and deserialization process on objects that are instances of that class.
508Those hooks can redefine the way serialization is performed (and therefore,
509how the symetrical deserialization should be conducted).
510
511Since we said earlier:
512
513 dclone(.) = thaw(freeze(.))
514
515everything we say about hooks should also hold for deep cloning. However,
516hooks get to know whether the operation is a mere serialization, or a cloning.
517
518Therefore, when serializing hooks are involved,
519
520 dclone(.) <> thaw(freeze(.))
521
522Well, you could keep them in sync, but there's no guarantee it will always
523hold on classes somebody else wrote. Besides, there is little to gain in
524doing so: a serializing hook could only keep one attribute of an object,
525which is probably not what should happen during a deep cloning of that
526same object.
527
528Here is the hooking interface:
529
bbc7dcd2 530=over 4
7a6a85bf 531
532=item C<STORABLE_freeze> I<obj>, I<cloning>
533
534The serializing hook, called on the object during serialization. It can be
535inherited, or defined in the class itself, like any other method.
536
537Arguments: I<obj> is the object to serialize, I<cloning> is a flag indicating
538whether we're in a dclone() or a regular serialization via store() or freeze().
539
540Returned value: A LIST C<($serialized, $ref1, $ref2, ...)> where $serialized
541is the serialized form to be used, and the optional $ref1, $ref2, etc... are
542extra references that you wish to let the Storable engine serialize.
543
544At deserialization time, you will be given back the same LIST, but all the
545extra references will be pointing into the deserialized structure.
546
547The B<first time> the hook is hit in a serialization flow, you may have it
548return an empty list. That will signal the Storable engine to further
549discard that hook for this class and to therefore revert to the default
550serialization of the underlying Perl data. The hook will again be normally
551processed in the next serialization.
552
553Unless you know better, serializing hook should always say:
554
555 sub STORABLE_freeze {
556 my ($self, $cloning) = @_;
557 return if $cloning; # Regular default serialization
558 ....
559 }
560
561in order to keep reasonable dclone() semantics.
562
563=item C<STORABLE_thaw> I<obj>, I<cloning>, I<serialized>, ...
564
565The deserializing hook called on the object during deserialization.
566But wait. If we're deserializing, there's no object yet... right?
567
568Wrong: the Storable engine creates an empty one for you. If you know Eiffel,
569you can view C<STORABLE_thaw> as an alternate creation routine.
570
571This means the hook can be inherited like any other method, and that
572I<obj> is your blessed reference for this particular instance.
573
574The other arguments should look familiar if you know C<STORABLE_freeze>:
575I<cloning> is true when we're part of a deep clone operation, I<serialized>
576is the serialized string you returned to the engine in C<STORABLE_freeze>,
577and there may be an optional list of references, in the same order you gave
578them at serialization time, pointing to the deserialized objects (which
579have been processed courtesy of the Storable engine).
580
212e9bde 581When the Storable engine does not find any C<STORABLE_thaw> hook routine,
582it tries to load the class by requiring the package dynamically (using
583the blessed package name), and then re-attempts the lookup. If at that
584time the hook cannot be located, the engine croaks. Note that this mechanism
585will fail if you define several classes in the same file, but perlmod(1)
586warned you.
587
7a6a85bf 588It is up to you to use these information to populate I<obj> the way you want.
589
590Returned value: none.
591
592=back
593
594=head2 Predicates
595
596Predicates are not exportable. They must be called by explicitely prefixing
597them with the Storable package name.
598
bbc7dcd2 599=over 4
7a6a85bf 600
601=item C<Storable::last_op_in_netorder>
602
603The C<Storable::last_op_in_netorder()> predicate will tell you whether
604network order was used in the last store or retrieve operation. If you
605don't know how to use this, just forget about it.
606
607=item C<Storable::is_storing>
608
609Returns true if within a store operation (via STORABLE_freeze hook).
610
611=item C<Storable::is_retrieving>
612
613Returns true if within a retrieve operation, (via STORABLE_thaw hook).
614
615=back
616
617=head2 Recursion
618
619With hooks comes the ability to recurse back to the Storable engine. Indeed,
620hooks are regular Perl code, and Storable is convenient when it comes to
621serialize and deserialize things, so why not use it to handle the
622serialization string?
623
624There are a few things you need to know however:
625
bbc7dcd2 626=over 4
7a6a85bf 627
628=item *
629
630You can create endless loops if the things you serialize via freeze()
631(for instance) point back to the object we're trying to serialize in the hook.
632
633=item *
634
635Shared references among objects will not stay shared: if we're serializing
636the list of object [A, C] where both object A and C refer to the SAME object
637B, and if there is a serializing hook in A that says freeze(B), then when
638deserializing, we'll get [A', C'] where A' refers to B', but C' refers to D,
639a deep clone of B'. The topology was not preserved.
640
641=back
642
643That's why C<STORABLE_freeze> lets you provide a list of references
644to serialize. The engine guarantees that those will be serialized in the
645same context as the other objects, and therefore that shared objects will
646stay shared.
647
648In the above [A, C] example, the C<STORABLE_freeze> hook could return:
649
650 ("something", $self->{B})
651
652and the B part would be serialized by the engine. In C<STORABLE_thaw>, you
653would get back the reference to the B' object, deserialized for you.
654
655Therefore, recursion should normally be avoided, but is nonetheless supported.
656
657=head2 Deep Cloning
658
659There is a new Clone module available on CPAN which implements deep cloning
660natively, i.e. without freezing to memory and thawing the result. It is
661aimed to replace Storable's dclone() some day. However, it does not currently
662support Storable hooks to redefine the way deep cloning is performed.
663
664=head1 EXAMPLES
665
666Here are some code samples showing a possible usage of Storable:
667
668 use Storable qw(store retrieve freeze thaw dclone);
669
670 %color = ('Blue' => 0.1, 'Red' => 0.8, 'Black' => 0, 'White' => 1);
671
672 store(\%color, '/tmp/colors') or die "Can't store %a in /tmp/colors!\n";
673
674 $colref = retrieve('/tmp/colors');
675 die "Unable to retrieve from /tmp/colors!\n" unless defined $colref;
676 printf "Blue is still %lf\n", $colref->{'Blue'};
677
678 $colref2 = dclone(\%color);
679
680 $str = freeze(\%color);
681 printf "Serialization of %%color is %d bytes long.\n", length($str);
682 $colref3 = thaw($str);
683
684which prints (on my machine):
685
686 Blue is still 0.100000
687 Serialization of %color is 102 bytes long.
688
689=head1 WARNING
690
691If you're using references as keys within your hash tables, you're bound
692to disapointment when retrieving your data. Indeed, Perl stringifies
693references used as hash table keys. If you later wish to access the
694items via another reference stringification (i.e. using the same
695reference that was used for the key originally to record the value into
696the hash table), it will work because both references stringify to the
697same string.
698
699It won't work across a C<store> and C<retrieve> operations however, because
700the addresses in the retrieved objects, which are part of the stringified
701references, will probably differ from the original addresses. The
702topology of your structure is preserved, but not hidden semantics
703like those.
704
705On platforms where it matters, be sure to call C<binmode()> on the
706descriptors that you pass to Storable functions.
707
708Storing data canonically that contains large hashes can be
709significantly slower than storing the same data normally, as
710temprorary arrays to hold the keys for each hash have to be allocated,
711populated, sorted and freed. Some tests have shown a halving of the
712speed of storing -- the exact penalty will depend on the complexity of
713your data. There is no slowdown on retrieval.
714
715=head1 BUGS
716
717You can't store GLOB, CODE, FORMLINE, etc... If you can define
718semantics for those operations, feel free to enhance Storable so that
719it can deal with them.
720
721The store functions will C<croak> if they run into such references
722unless you set C<$Storable::forgive_me> to some C<TRUE> value. In that
723case, the fatal message is turned in a warning and some
724meaningless string is stored instead.
725
726Setting C<$Storable::canonical> may not yield frozen strings that
727compare equal due to possible stringification of numbers. When the
728string version of a scalar exists, it is the form stored, therefore
729if you happen to use your numbers as strings between two freezing
730operations on the same data structures, you will get different
731results.
732
dd19458b 733When storing doubles in network order, their value is stored as text.
734However, you should also not expect non-numeric floating-point values
735such as infinity and "not a number" to pass successfully through a
736nstore()/retrieve() pair.
737
738As Storable neither knows nor cares about character sets (although it
739does know that characters may be more than eight bits wide), any difference
740in the interpretation of character codes between a host and a target
741system is your problem. In particular, if host and target use different
742code points to represent the characters used in the text representation
743of floating-point numbers, you will not be able be able to exchange
744floating-point data, even with nstore().
745
7a6a85bf 746=head1 CREDITS
747
748Thank you to (in chronological order):
749
750 Jarkko Hietaniemi <jhi@iki.fi>
751 Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
752 Benjamin A. Holzman <bah@ecnvantage.com>
753 Andrew Ford <A.Ford@ford-mason.co.uk>
754 Gisle Aas <gisle@aas.no>
755 Jeff Gresham <gresham_jeffrey@jpmorgan.com>
756 Murray Nesbitt <murray@activestate.com>
757 Marc Lehmann <pcg@opengroup.org>
9e21b3d0 758 Justin Banks <justinb@wamnet.com>
759 Jarkko Hietaniemi <jhi@iki.fi> (AGAIN, as perl 5.7.0 Pumpkin!)
dd19458b 760 Salvador Ortiz Garcia <sog@msg.com.mx>
761 Dominic Dunlop <domo@computer.org>
762 Erik Haugan <erik@solbors.no>
7a6a85bf 763
764for their bug reports, suggestions and contributions.
765
766Benjamin Holzman contributed the tied variable support, Andrew Ford
767contributed the canonical order for hashes, and Gisle Aas fixed
768a few misunderstandings of mine regarding the Perl internals,
769and optimized the emission of "tags" in the output streams by
770simply counting the objects instead of tagging them (leading to
771a binary incompatibility for the Storable image starting at version
7720.6--older images are of course still properly understood).
773Murray Nesbitt made Storable thread-safe. Marc Lehmann added overloading
774and reference to tied items support.
775
776=head1 TRANSLATIONS
777
778There is a Japanese translation of this man page available at
779http://member.nifty.ne.jp/hippo2000/perltips/storable.htm ,
780courtesy of Kawai, Takanori <kawai@nippon-rad.co.jp>.
781
782=head1 AUTHOR
783
784Raphael Manfredi F<E<lt>Raphael_Manfredi@pobox.comE<gt>>
785
786=head1 SEE ALSO
787
788Clone(3).
789
790=cut
791