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