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