On 9/26/07, Michael G Schwern <[EMAIL PROTECTED]> wrote:
> demerphq wrote:
> >> If that's the case, perhaps the docs for Terse could use stronger language.
> >> Right now it's a little obtuse.
> >>
> >> · $Data::Dumper::Terse or $OBJ−>Terse([NEWVAL])
> >>
> >> When set, Data::Dumper will emit single, non‐self‐referential
> >> values as atoms/terms rather than statements. This means that the
> >> $VARn names will be avoided where possible, but be advised that
> >> such output may not always be parseable by "eval".
> >>
> >> Something like B<don't use this to serialize data in production!>
> >
> > I guess. To me thats obvious given the <but be advised that
> > such output may not always be parseable by "eval">
>
> Yeah, but you wrote a Dumper. :)
>
> Terse shows up in a bunch of examples, perhaps it should be removed from them?
Would something like the following patch be good in your opinion?
Untested because I don't have a compiler handy. :-(
Cheers,
yves
--
perl -Mre=debug -e "/just|another|perl|hacker/"
Only in Data-Dumper-2.121-Patched: Dumper.c
diff -wur Data-Dumper-2.121/Dumper.pm Data-Dumper-2.121-Patched/Dumper.pm
--- Data-Dumper-2.121/Dumper.pm 2003-08-24 07:12:00.000000000 +0200
+++ Data-Dumper-2.121-Patched/Dumper.pm 2007-09-26 10:13:15.984375000 +0200
@@ -9,7 +9,8 @@
package Data::Dumper;
-$VERSION = '2.121';
+$VERSION = '2.121_999';
+$VERSION = eval $VERSION;
#$| = 1;
@@ -22,7 +23,7 @@
@ISA = qw(Exporter);
@EXPORT = qw(Dumper);
[EMAIL PROTECTED] = qw(DumperX);
[EMAIL PROTECTED] = qw(DumperX DumpVar Dumpf Dumpp);
XSLoader::load 'Data::Dumper';
@@ -492,6 +493,17 @@
sub Dumpp { print Data::Dumper->Dump(@_) }
+sub DumpVar {
+ @_ != 1 and croak "DumpVar() expects exactly one argument";
+ return "do{ my "
+ . Data::Dumper->new([EMAIL PROTECTED],['x'])
+ ->Purity(1)
+ ->Terse(0)
+ ->Indent(0)
+ ->Dump()
+ . '$x }'
+}
+
#
# reset the "seen" cache
#
@@ -675,11 +687,24 @@
# OO usage
$d = Data::Dumper->new([$foo, $bar], [qw(foo *ary)]);
...
+ # Debugging Grade Output
print $d->Dump;
...
- $d->Purity(1)->Terse(1)->Deepcopy(1);
+ # Persistance grade serialization
+ print $d->Purity(1)->Dump();
+
+ # Make a deep copy of the data
+ $d->Purity(1)->Deepcopy(1);
eval $d->Dump;
+ # "Pretty output" UNSAFE for serialization
+ print $d->Terse(1)->Dump;
+
+ # Dump a single var for peristance purposes
+ use Data::Dumper qw(DumpVar);
+ $persist= DumpVar($original);
+ $restore= eval $persist;
+
=head1 DESCRIPTION
@@ -719,6 +744,19 @@
the C<Indent> flag. See L<Configuration Variables or Methods> below
for details.
+=head2 Using Data::Dumper as a Data Persistance Mechanism
+
+It is unsafe to use Data::Dumper as a data persistance mechanism without setting
+Purity to 1 through either the global variable C<$Data::Dumper::Purity> or
+through the method call form Purity(1).
+
+If you wish to serialize a single variable safely it is recommended you use
+the DumpVar() subroutine, which will produce output that can be safely eval'ed
+back. For instance
+
+ use Data::Dumper qw(DumpVar);
+ my $persist= DumpVar($original);
+ my $restore= eval $persist;
=head2 Methods
@@ -796,6 +834,16 @@
output, where I<n> is a numeric suffix. Will return a list of strings
in a list context.
+=item DumpVar(I<VAR>)
+
+Returns the stringified version of a single var suitable for data peristance
+and restoration via eval.
+
+ my $persist= DumpVar($original);
+ # ...
+ my $restore= eval $persist
+ or die "Serialized data appears corrupt: [EMAIL PROTECTED]";
+
=back
=head2 Configuration Variables or Methods
@@ -871,7 +919,11 @@
When set, Data::Dumper will emit single, non-self-referential values as
atoms/terms rather than statements. This means that the C<$VAR>I<n> names
will be avoided where possible, but be advised that such output may not
-always be parseable by C<eval>.
+always be parseable by C<eval>. B<This means that using Terse(1) in production
+code as a data persistance mechansim is strongly discouraged.>
+
+See C<DumpVar> if you wish to have a var serialized such that it can be restored
+by capturing the result of evaling the serialized data.
=item *
Only in Data-Dumper-2.121-Patched: Dumper.pm.bak
Only in Data-Dumper-2.121-Patched: Makefile
Only in Data-Dumper-2.121-Patched: blib
Only in Data-Dumper-2.121-Patched: pm_to_blib