home *** CD-ROM | disk | FTP | other *** search
/ Chip 2000 May / Chip_2000-05_cd1.bin / zkuste / Perl / ActivePerl-5.6.0.613.msi / 䆊䌷䈹䈙䏵-䞅䞆䞀㡆䞃䄦䠥 / _e2d3337c19eccb150dc293cbddd571cd < prev    next >
Text File  |  2000-03-23  |  13KB  |  276 lines

  1.  
  2. <HTML>
  3. <HEAD>
  4. <TITLE>Storable - persistency for perl data structures</TITLE>
  5. <LINK REL="stylesheet" HREF="../../Active.css" TYPE="text/css">
  6. <LINK REV="made" HREF="mailto:">
  7. </HEAD>
  8.  
  9. <BODY>
  10. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  11. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  12. <STRONG><P CLASS=block> Storable - persistency for perl data structures</P></STRONG>
  13. </TD></TR>
  14. </TABLE>
  15.  
  16. <A NAME="__index__"></A>
  17. <!-- INDEX BEGIN -->
  18.  
  19. <UL>
  20.  
  21.     <LI><A HREF="#name">NAME</A></LI><LI><A HREF="#supportedplatforms">SUPPORTED PLATFORMS</A></LI>
  22.  
  23.     <LI><A HREF="#synopsis">SYNOPSIS</A></LI>
  24.     <LI><A HREF="#description">DESCRIPTION</A></LI>
  25.     <LI><A HREF="#memory store">MEMORY STORE</A></LI>
  26.     <LI><A HREF="#speed">SPEED</A></LI>
  27.     <LI><A HREF="#canonical representation">CANONICAL REPRESENTATION</A></LI>
  28.     <LI><A HREF="#wizards only">WIZARDS ONLY</A></LI>
  29.     <LI><A HREF="#examples">EXAMPLES</A></LI>
  30.     <LI><A HREF="#warning">WARNING</A></LI>
  31.     <LI><A HREF="#bugs">BUGS</A></LI>
  32.     <LI><A HREF="#credits">CREDITS</A></LI>
  33.     <LI><A HREF="#translations">TRANSLATIONS</A></LI>
  34.     <LI><A HREF="#author">AUTHOR</A></LI>
  35. </UL>
  36. <!-- INDEX END -->
  37.  
  38. <HR>
  39. <P>
  40. <H1><A NAME="name">NAME</A></H1>
  41. <P>Storable - persistency for perl data structures</P>
  42. <P>
  43. <HR>
  44. <H1><A NAME="supportedplatforms">SUPPORTED PLATFORMS</A></H1>
  45. <UL>
  46. <LI>Linux</LI>
  47. <LI>Solaris</LI>
  48. <LI>Windows</LI>
  49. </UL>
  50. <HR>
  51. <H1><A NAME="synopsis">SYNOPSIS</A></H1>
  52. <PRE>
  53.  use Storable;
  54.  store \%table, 'file';
  55.  $hashref = retrieve('file');</PRE>
  56. <PRE>
  57.  use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);</PRE>
  58. <PRE>
  59.  # Network order
  60.  nstore \%table, 'file';
  61.  $hashref = retrieve('file');   # There is NO nretrieve()</PRE>
  62. <PRE>
  63.  # Storing to and retrieving from an already opened file
  64.  store_fd \@array, \*STDOUT;
  65.  nstore_fd \%table, \*STDOUT;
  66.  $aryref = retrieve_fd(\*SOCKET);
  67.  $hashref = retrieve_fd(\*SOCKET);</PRE>
  68. <PRE>
  69.  # Serializing to memory
  70.  $serialized = freeze \%table;
  71.  %table_clone = %{ thaw($serialized) };</PRE>
  72. <PRE>
  73.  # Deep (recursive) cloning
  74.  $cloneref = dclone($ref);</PRE>
  75. <P>
  76. <HR>
  77. <H1><A NAME="description">DESCRIPTION</A></H1>
  78. <P>The Storable package brings persistency to your perl data structures
  79. containing SCALAR, ARRAY, HASH or REF objects, i.e. anything that can be
  80. convenientely stored to disk and retrieved at a later time.</P>
  81. <P>It can be used in the regular procedural way by calling <CODE>store</CODE> with
  82. a reference to the object to be stored, along with the file name where
  83. the image should be written.
  84. The routine returns <A HREF="../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> for I/O problems or other internal error,
  85. a true value otherwise. Serious errors are propagated as a <A HREF="../../lib/Pod/perlfunc.html#item_die"><CODE>die</CODE></A> exception.</P>
  86. <P>To retrieve data stored to disk, use <CODE>retrieve</CODE> with a file name,
  87. and the objects stored into that file are recreated into memory for you,
  88. a <EM>reference</EM> to the root object being returned. In case an I/O error
  89. occurs while reading, <A HREF="../../lib/Pod/perlfunc.html#item_undef"><CODE>undef</CODE></A> is returned instead. Other serious
  90. errors are propagated via <A HREF="../../lib/Pod/perlfunc.html#item_die"><CODE>die</CODE></A>.</P>
  91. <P>Since storage is performed recursively, you might want to stuff references
  92. to objects that share a lot of common data into a single array or hash
  93. table, and then store that object. That way, when you retrieve back the
  94. whole thing, the objects will continue to share what they originally shared.</P>
  95. <P>At the cost of a slight header overhead, you may store to an already
  96. opened file descriptor using the <CODE>store_fd</CODE> routine, and retrieve
  97. from a file via <CODE>retrieve_fd</CODE>. Those names aren't imported by default,
  98. so you will have to do that explicitely if you need those routines.
  99. The file descriptor you supply must be already opened, for read
  100. if you're going to retrieve and for write if you wish to store.</P>
  101. <PRE>
  102.         store_fd(\%table, *STDOUT) || die "can't store to stdout\n";
  103.         $hashref = retrieve_fd(*STDIN);</PRE>
  104. <P>You can also store data in network order to allow easy sharing across
  105. multiple platforms, or when storing on a socket known to be remotely
  106. connected. The routines to call have an initial <CODE>n</CODE> prefix for <EM>network</EM>,
  107. as in <CODE>nstore</CODE> and <CODE>nstore_fd</CODE>. At retrieval time, your data will be
  108. correctly restored so you don't have to know whether you're restoring
  109. from native or network ordered data.</P>
  110. <P>When using <CODE>retrieve_fd</CODE>, objects are retrieved in sequence, one
  111. object (i.e. one recursive tree) per associated <CODE>store_fd</CODE>.</P>
  112. <P>If you're more from the object-oriented camp, you can inherit from
  113. Storable and directly store your objects by invoking <CODE>store</CODE> as
  114. a method. The fact that the root of the to-be-stored tree is a
  115. blessed reference (i.e. an object) is special-cased so that the
  116. retrieve does not provide a reference to that object but rather the
  117. blessed object reference itself. (Otherwise, you'd get a reference
  118. to that blessed object).</P>
  119. <P>
  120. <HR>
  121. <H1><A NAME="memory store">MEMORY STORE</A></H1>
  122. <P>The Storable engine can also store data into a Perl scalar instead, to
  123. later retrieve them. This is mainly used to freeze a complex structure in
  124. some safe compact memory place (where it can possibly be sent to another
  125. process via some IPC, since freezing the structure also serializes it in
  126. effect). Later on, and maybe somewhere else, you can thaw the Perl scalar
  127. out and recreate the original complex structure in memory.</P>
  128. <P>Surprisingly, the routines to be called are named <CODE>freeze</CODE> and <CODE>thaw</CODE>.
  129. If you wish to send out the frozen scalar to another machine, use
  130. <CODE>nfreeze</CODE> instead to get a portable image.</P>
  131. <P>Note that freezing an object structure and immediately thawing it
  132. actually achieves a deep cloning of that structure. Storable provides
  133. you with a <CODE>dclone</CODE> interface which does not create that intermediary
  134. scalar but instead freezes the structure in some internal memory space
  135. and then immediatly thaws it out.</P>
  136. <P>
  137. <HR>
  138. <H1><A NAME="speed">SPEED</A></H1>
  139. <P>The heart of Storable is written in C for decent speed. Extra low-level
  140. optimization have been made when manipulating perl internals, to
  141. sacrifice encapsulation for the benefit of a greater speed.</P>
  142. <P>Storage is now slightly slower than retrieval since the former has to
  143. also store data in a hash table to keep track of which objects
  144. have been stored already, whilst the latter uses an array instead of
  145. a hash table.</P>
  146. <P>On my HP 9000/712 machine running HPUX 9.03 and with perl 5.004, I can
  147. store 0.85 Mbyte/s and I can retrieve at 0.90 Mbytes/s, approximatively
  148. (CPU + system time).
  149. This was measured with Benchmark and the <EM>Magic: The Gathering</EM>
  150. database from Tom Christiansen (1.6 Mbytes on disk).</P>
  151. <P>
  152. <HR>
  153. <H1><A NAME="canonical representation">CANONICAL REPRESENTATION</A></H1>
  154. <P>Normally Storable stores elements of hashes in the order they are
  155. stored internally by Perl, i.e. pseudo-randomly.  If you set
  156. <CODE>$Storable::canonical</CODE> to some <CODE>TRUE</CODE> value, Storable will store
  157. hashes with the elements sorted by their key.  This allows you to
  158. compare data structures by comparing their frozen representations (or
  159. even the compressed frozen representations), which can be useful for
  160. creating lookup tables for complicated queries.</P>
  161. <P>Canonical order does not imply network order, those are two orthogonal
  162. settings.</P>
  163. <P>
  164. <HR>
  165. <H1><A NAME="wizards only">WIZARDS ONLY</A></H1>
  166. <P>The <CODE>Storable::last_op_in_netorder()</CODE> predicate will tell you whether
  167. network order was used in the last store or retrieve operation.  If you
  168. don't know how to use this, just forget about it.</P>
  169. <P>
  170. <HR>
  171. <H1><A NAME="examples">EXAMPLES</A></H1>
  172. <P>Here are some code samples showing a possible usage of Storable:</P>
  173. <PRE>
  174.         use Storable qw(store retrieve freeze thaw dclone);</PRE>
  175. <PRE>
  176.         %color = ('Blue' => 0.1, 'Red' => 0.8, 'Black' => 0, 'White' => 1);</PRE>
  177. <PRE>
  178.         store(\%color, '/tmp/colors') or die "Can't store %a in /tmp/colors!\n";</PRE>
  179. <PRE>
  180.         $colref = retrieve('/tmp/colors');
  181.         die "Unable to retrieve from /tmp/colors!\n" unless defined $colref;
  182.         printf "Blue is still %lf\n", $colref->{'Blue'};</PRE>
  183. <PRE>
  184.         $colref2 = dclone(\%color);</PRE>
  185. <PRE>
  186.         $str = freeze(\%color);
  187.         printf "Serialization of %%color is %d bytes long.\n", length($str);
  188.         $colref3 = thaw($str);</PRE>
  189. <P>which prints (on my machine):</P>
  190. <PRE>
  191.         Blue is still 0.100000
  192.         Serialization of %color is 102 bytes long.</PRE>
  193. <P>
  194. <HR>
  195. <H1><A NAME="warning">WARNING</A></H1>
  196. <P>If you're using references as keys within your hash tables, you're bound
  197. to disapointment when retrieving your data. Indeed, Perl stringifies
  198. references used as hash table keys. If you later wish to access the
  199. items via another reference stringification (i.e. using the same
  200. reference that was used for the key originally to record the value into
  201. the hash table), it will work because both references stringify to the
  202. same string.</P>
  203. <P>It won't work across a <CODE>store</CODE> and <CODE>retrieve</CODE> operations however, because
  204. the addresses in the retrieved objects, which are part of the stringified
  205. references, will probably differ from the original addresses. The
  206. topology of your structure is preserved, but not hidden semantics
  207. like those.</P>
  208. <P>On platforms where it matters, be sure to call <A HREF="../../lib/Pod/perlfunc.html#item_binmode"><CODE>binmode()</CODE></A> on the
  209. descriptors that you pass to Storable functions.</P>
  210. <P>Storing data canonically that contains large hashes can be
  211. significantly slower than storing the same data normally, as
  212. temprorary arrays to hold the keys for each hash have to be allocated,
  213. populated, sorted and freed.  Some tests have shown a halving of the
  214. speed of storing -- the exact penalty will depend on the complexity of
  215. your data.  There is no slowdown on retrieval.</P>
  216. <P>
  217. <HR>
  218. <H1><A NAME="bugs">BUGS</A></H1>
  219. <P>You can't store GLOB, CODE, FORMLINE, etc... If you can define
  220. semantics for those operations, feel free to enhance Storable so that
  221. it can deal with them.</P>
  222. <P>The store functions will <CODE>croak</CODE> if they run into such references
  223. unless you set <CODE>$Storable::forgive_me</CODE> to some <CODE>TRUE</CODE> value. In that
  224. case, the fatal message is turned in a warning and some
  225. meaningless string is stored instead.</P>
  226. <P>Setting <CODE>$Storable::canonical</CODE> may not yield frozen strings that
  227. compare equal due to possible stringification of numbers. When the
  228. string version of a scalar exists, it is the form stored, therefore
  229. if you happen to use your numbers as strings between two freezing
  230. operations on the same data structures, you will get different
  231. results.</P>
  232. <P>Due to the aforementionned optimizations, Storable is at the mercy
  233. of perl's internal redesign or structure changes. If that bothers
  234. you, you can try convincing Larry that what is used in Storable
  235. should be documented and consistently kept in future revisions.</P>
  236. <P>
  237. <HR>
  238. <H1><A NAME="credits">CREDITS</A></H1>
  239. <P>Thank you to (in chronological order):</P>
  240. <PRE>
  241.         Jarkko Hietaniemi <jhi@iki.fi>
  242.         Ulrich Pfeifer <pfeifer@charly.informatik.uni-dortmund.de>
  243.         Benjamin A. Holzman <benjamin.a.holzman@bender.com>
  244.         Andrew Ford <A.Ford@ford-mason.co.uk>
  245.         Gisle Aas <gisle@aas.no>
  246.         Jeff Gresham <gresham_jeffrey@jpmorgan.com>
  247.         Murray Nesbitt <murray@activestate.com></PRE>
  248. <P>for their bug reports, suggestions and contributions.</P>
  249. <P>Benjamin Holzman contributed the tied variable support, Andrew Ford
  250. contributed the canonical order for hashes, and Gisle Aas fixed
  251. a few misunderstandings of mine regarding the Perl internals,
  252. and optimized the emission of ``tags'' in the output streams by
  253. simply counting the objects instead of tagging them (leading to
  254. a binary incompatibility for the Storable image starting at version
  255. 0.6--older images are of course still properly understood).
  256. Murray Nesbitt made Storable thread-safe.</P>
  257. <P>
  258. <HR>
  259. <H1><A NAME="translations">TRANSLATIONS</A></H1>
  260. <P>There is a Japanese translation of this man page available at
  261. <A HREF="http://member.nifty.ne.jp/hippo2000/perltips/storable.htm">http://member.nifty.ne.jp/hippo2000/perltips/storable.htm</A> ,
  262. courtesy of Kawai, Takanori <<A HREF="mailto:kawai@nippon-rad.co.jp">kawai@nippon-rad.co.jp</A>>.</P>
  263. <P>
  264. <HR>
  265. <H1><A NAME="author">AUTHOR</A></H1>
  266. <P>Raphael Manfredi <EM><<A HREF="mailto:Raphael_Manfredi@pobox.com">Raphael_Manfredi@pobox.com</A>></EM></P>
  267. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=100%>
  268. <TR><TD CLASS=block VALIGN=MIDDLE WIDTH=100% BGCOLOR="#cccccc">
  269. <STRONG><P CLASS=block> Storable - persistency for perl data structures</P></STRONG>
  270. </TD></TR>
  271. </TABLE>
  272.  
  273. </BODY>
  274.  
  275. </HTML>
  276.