Open p5pRT opened 12 years ago
I've noticed that Data::Dumper does not always create ouput that will eval correctly for self-referential structures\, even if Purity=1.
For example\, take this code:
==================== use Data::Dumper;
This produces the output:
==================== $VAR1 = { 'a' => [ { 'c' => {} } ]\, 'b' => 1\, 'd' => {} }; $VAR1->{'a'}[0]{'c'} = $VAR1; $VAR1->{'d'} = $VAR1->{'a'}[0];
Note that the first outputs $h\, while the second outputs $m. This is because\, as the 'eval' function description states:
"In both forms\, the value returned is the value of the last expression evaluated inside the mini-program; a return statement may be also used\, just as with subroutines. The expression providing the return value is evaluated in void\, scalar\, or list context\, depending on the context of the eval itself."
The correct output could be obtained by adding a '$VAR1' at the end of the structure\, whenever the structure is self-referential.
This issue also appears to be present as late as perl 5.12.4.
goldstei@ugcs.caltech.edu wrote:
I've noticed that Data::Dumper does not always create ouput that will eval correctly for self-referential structures\, even if Purity=1. ... my $s = Dumper($h); my $a = eval $s;
Data::Dumper doesn't actually claim that the eval will return the structure\, only that it will *recreate* it. Which it did: it assigned it to $VAR1. Try
my $VAR1; eval $s; my $a = $VAR1;
The documentation could do with clarification on this point.
-zefram
The RT System itself - Status changed from 'new' to 'open'
Not a bug. Data::Dumper doesn't say it does this.
You can easily use Data::Dumper in a way it does not matter.
For instance
my $dump= 'do{' . Data::Dumper->new([$x\,$y\,$z]\, [qw($x $y $z)])->Purity(1)->Dump() . ' ($x\,$y\,$z) }'
cheers\, yves
On 29 November 2011 22:25\, goldstei@ugcs.caltech.edu \perlbug\-followup@​perl\.org wrote:
# New Ticket Created by goldstei@ugcs.caltech.edu # Please include the string: [perl #104906] # in the subject line of all future correspondence about this issue. # \<URL: https://rt-archive.perl.org/perl5/Ticket/Display.html?id=104906 >
This is a bug report for perl from goldstei@ugcs.caltech.edu\, generated with the help of perlbug 1.39 running under perl 5.10.1.
----------------------------------------------------------------- [Please describe your issue here]
I've noticed that Data::Dumper does not always create ouput that will eval correctly for self-referential structures\, even if Purity=1.
For example\, take this code:
==================== use Data::Dumper;
my $h = {b => 1}; my $m = {c => $h}; $h->{d} = $m; $h->{a}[0] = $m; $Data::Dumper::Purity = 1; print Dumper($h) . "\n"; my $s = Dumper($h); my $a = eval $s; print Dumper($a);
This produces the output:
==================== $VAR1 = { 'a' => [ { 'c' => {} } ]\, 'b' => 1\, 'd' => {} }; $VAR1->{'a'}[0]{'c'} = $VAR1; $VAR1->{'d'} = $VAR1->{'a'}[0];
$VAR1 = { 'c' => { 'a' => [ {} ]\, 'b' => 1\, 'd' => {} } }; $VAR1->{'c'}{'a'}[0] = $VAR1; $VAR1->{'c'}{'d'} = $VAR1;
Note that the first outputs $h\, while the second outputs $m. This is because\, as the 'eval' function description states:
"In both forms\, the value returned is the value of the last expression evaluated inside the mini-program; a return statement may be also used\, just as with subroutines. The expression providing the return value is evaluated in void\, scalar\, or list context\, depending on the context of the eval itself."
The correct output could be obtained by adding a '$VAR1' at the end of the structure\, whenever the structure is self-referential.
This issue also appears to be present as late as perl 5.12.4.
[Please do not change anything below this line] ----------------------------------------------------------------- --- Flags: category=library severity=low module=Data::Dumper --- Site configuration information for perl 5.10.1:
Configured by Debian Project at Thu Jun 30 22:25:10 UTC 2011.
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
Platform: osname=linux\, osvers=2.6.32-5-amd64\, archname=x86_64-linux-gnu-thread-multi uname='linux brahms 2.6.32-5-amd64 #1 smp tue jun 14 09:42:28 utc 2011 x86_64 gnulinux ' config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des' hint=recommended\, useposix=true\, d_sigaction=define useithreads=define\, usemultiplicity=define useperlio=define\, d_sfio=undef\, uselargefiles=define\, usesocks=undef use64bitint=define\, use64bitall=define\, uselongdouble=undef usemymalloc=n\, bincompat5005=undef Compiler: cc='cc'\, ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64'\, optimize='-O2 -g'\, cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include' ccversion=''\, gccversion='4.4.5'\, gccosandvers='' intsize=4\, longsize=8\, ptrsize=8\, doublesize=8\, byteorder=12345678 d_longlong=define\, longlongsize=8\, d_longdbl=define\, longdblsize=16 ivtype='long'\, ivsize=8\, nvtype='double'\, nvsize=8\, Off_t='off_t'\, lseeksize=8 alignbytes=8\, prototype=define Linker and Libraries: ld='cc'\, ldflags =' -fstack-protector -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib /lib64 /usr/lib64 libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt perllibs=-ldl -lm -lpthread -lc -lcrypt libc=/lib/libc-2.11.2.so\, so=so\, useshrplib=true\, libperl=libperl.so.5.10.1 gnulibc_version='2.11.2' Dynamic Linking: dlsrc=dl_dlopen.xs\, dlext=so\, d_dlsymun=undef\, ccdlflags='-Wl\,-E' cccdlflags='-fPIC'\, lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'
Locally applied patches: DEBPKG:debian/arm_thread_stress_timeout - http://bugs.debian.org/501970 Raise the timeout of ext/threads/shared/t/stress.t to accommodate slower build hosts DEBPKG:debian/cpan_config_path - Set location of CPAN::Config to /etc/perl as /usr may not be writable. DEBPKG:debian/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules installed from CPAN. DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove overly restrictive DB_File version check. DEBPKG:debian/doc_info - Replace generic man(1) instructions with Debian-specific information. DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak enc2xs to follow symlinks and ignore missing @INC directories. DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove Errno version check due to upgrade problems with long-running processes. DEBPKG:debian/extutils_hacks - Various debian-specific ExtUtils changes DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to the binary targets. DEBPKG:debian/instmodsh_doc - Debian policy doesn't install .packlist files for core or vendor. DEBPKG:debian/ld_run_path - Remove standard libs from LD_RUN_PATH as per Debian policy. DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to /etc/perl/Net as /usr may not be writable. DEBPKG:debian/m68k_thread_stress - http://bugs.debian.org/495826 Disable some threads tests on m68k for now due to missing TLS. DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian DEBPKG:debian/module_build_man_extensions - http://bugs.debian.org/479460 Adjust Module::Build manual page extensions for the Debian Perl policy DEBPKG:debian/perl_synopsis - http://bugs.debian.org/278323 Rearrange perl.pod DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune the list of libraries wanted to what we actually need. DEBPKG:debian/use_gdbm - Explicitly link against -lgdbm_compat in ODBM_File/NDBM_File. DEBPKG:fixes/assorted_docs - http://bugs.debian.org/443733 [384f06a] Math::BigInt::CalcEmu documentation grammar fix DEBPKG:fixes/net_smtp_docs - http://bugs.debian.org/100195 [rt.cpan.org #36038] Document the Net::SMTP 'Port' option DEBPKG:fixes/processPL - http://bugs.debian.org/357264 [rt.cpan.org #17224] Always use PERLRUNINST when building perl modules. DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make perlivp skip include directories in /usr/local DEBPKG:fixes/pod2man-index-backslash - http://bugs.debian.org/521256 Escape backslashes in .IX entries DEBPKG:debian/disable-zlib-bundling - Disable zlib bundling in Compress::Raw::Zlib DEBPKG:fixes/kfreebsd_cppsymbols - http://bugs.debian.org/533098 [3b910a0] Add gcc predefined macros to $Config{cppsymbols} on GNU/kFreeBSD. DEBPKG:debian/cpanplus_definstalldirs - http://bugs.debian.org/533707 Configure CPANPLUS to use the site directories by default. DEBPKG:debian/cpanplus_config_path - Save local versions of CPANPLUS::Config::System into /etc/perl. DEBPKG:fixes/kfreebsd-filecopy-pipes - http://bugs.debian.org/537555 [16f708c] Fix File::Copy::copy with pipes on GNU/kFreeBSD DEBPKG:fixes/anon-tmpfile-dir - http://bugs.debian.org/528544 [perl #66452] Honor TMPDIR when open()ing an anonymous temporary file DEBPKG:fixes/abstract-sockets - http://bugs.debian.org/329291 [89904c0] Add support for Abstract namespace sockets. DEBPKG:fixes/hurd_cppsymbols - http://bugs.debian.org/544307 [eeb92b7] Add gcc predefined macros to $Config{cppsymbols} on GNU/Hurd. DEBPKG:fixes/autodie-flock - http://bugs.debian.org/543731 Allow for flock returning EAGAIN instead of EWOULDBLOCK on linux/parisc DEBPKG:fixes/archive-tar-instance-error - http://bugs.debian.org/539355 [rt.cpan.org #48879] Separate Archive::Tar instance error strings from each other DEBPKG:fixes/positive-gpos - http://bugs.debian.org/545234 [perl #69056] [c584a96] Fix \\G crash on first match DEBPKG:debian/devel-ppport-ia64-optim - http://bugs.debian.org/548943 Work around an ICE on ia64 DEBPKG:fixes/trie-logic-match - http://bugs.debian.org/552291 [perl #69973] [0abd0d7] Fix a DoS in Unicode processing [CVE-2009-3626] DEBPKG:fixes/hppa-thread-eagain - http://bugs.debian.org/554218 make the threads-shared test suite more robust\, fixing failures on hppa DEBPKG:fixes/crash-on-undefined-destroy - http://bugs.debian.org/564074 [perl #71952] [1f15e67] Fix a NULL pointer dereference when looking for a DESTROY method DEBPKG:fixes/tainted-errno - http://bugs.debian.org/574129 [perl #61976] [be1cf43] fix an errno stringification bug in taint mode DEBPKG:fixes/safe-upgrade - http://bugs.debian.org/582978 Upgrade Safe.pm to 2.25\, fixing CVE-2010-1974 DEBPKG:fixes/tell-crash - http://bugs.debian.org/578577 [f4817f3] Fix a tell() crash on bad arguments. DEBPKG:fixes/format-write-crash - http://bugs.debian.org/579537 [perl #22977] [421f30e] Fix a crash in format/write DEBPKG:fixes/arm-alignment - http://bugs.debian.org/289884 [f1c7503] Prevent gcc from optimizing the alignment test away on armel DEBPKG:fixes/fcgi-test - Fix a failure in CGI/t/fast.t when FCGI is installed DEBPKG:fixes/hurd-ccflags - http://bugs.debian.org/587901 Make hints/gnu.sh append to $ccflags rather than overriding them DEBPKG:debian/squelch-locale-warnings - http://bugs.debian.org/508764 Squelch locale warnings in Debian package maintainer scripts DEBPKG:fixes/lc-numeric-docs - http://bugs.debian.org/379329 [perl #78452] [903eb63] LC_NUMERIC documentation fixes DEBPKG:fixes/lc-numeric-sprintf - http://bugs.debian.org/601549 [perl #78632] [b3fd614] Fix sprintf not to ignore LC_NUMERIC with constants DEBPKG:fixes/concat-stack-corruption - http://bugs.debian.org/596105 [perl #78674] [e3393f5] Fix stack pointer corruption in pp_concat() with 'use encoding' DEBPKG:fixes/cgi-multiline-header - http://bugs.debian.org/606995 [CVE-2010-2761 CVE-2010-4410 CVE-2010-4411] CGI.pm MIME boundary and multiline header vulnerabilities DEBPKG:fixes/casing-taint-cve-2011-1487 - http://bugs.debian.org/622817 [perl #87336] fix unwanted taint laundering in lc()\, uc() et al. DEBPKG:fixes/safe-reval-rdo-cve-2010-1447 - [PATCH] Wrap by default coderefs returned by rdo and reval DEBPKG:patchlevel - http://bugs.debian.org/567489 List packaged patches for 5.10.1-17squeeze2 in patchlevel.h
--- @INC for perl 5.10.1: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .
--- Environment for perl 5.10.1: HOME=/afs/.ugcs/user/goldstei LANG=en_US.UTF-8 LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/afs/.ugcs/user/goldstei/ugcs2/scripts:/usr/ug/bin:/usr/ug/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/ug/adm/bin/scripts:/ug/adm/bin/:/usr/X11R6/bin:/afs/.ugcs/user/goldstei/bin:/afs/.ugcs/user/goldstei/maple10/bin:/mnt/cresol/cresol/ufs/egnor/i386-linux2/bin:/usr/ug/share/scripts:/afs/.ugcs/user/goldstei/ugcs2/scripts:/usr/ug/bin:/usr/ug/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/ug/adm/bin/scripts:/ug/adm/bin/:/usr/X11R6/bin:/afs/.ugcs/user/goldstei/bin:/afs/.ugcs/user/goldstei/maple10/bin:/mnt/cresol/cresol/ufs/egnor/i386-linux2/bin:/usr/ug/share/scripts:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games PERL_BADLANG (unset) SHELL=/bin/zsh
-- perl -Mre=debug -e "/just|another|perl|hacker/"
I agree that the documentation should be clarified to state that it will "recreate the variable named in the dump" (such as $VAR1) rather than recreating an assignable structure. I do think it would be cleaner if you could simply 'eval' it directly\, but I suppose it is the API designer's call.
Yves: I worked around this by doing exactly what you suggested before I had even filed this bug.
-- Joshua Goldstein goldstei@ugcs.caltech.edu (626)-529-6964
On Wed\, Nov 30\, 2011 at 12:34:59PM -0800\, Joshua Goldstein wrote:
I agree that the documentation should be clarified to state that it will "recreate the variable named in the dump" (such as $VAR1) rather than recreating an assignable structure. I do think it would be cleaner if you could simply 'eval' it directly\, but I suppose it is the API designer's call.
I can't actually see what harm would come from changing Data::Dumper to add 1 statement at the end to return the variable\, for the case of nested structures.
I believe that it wouldn't warn even if eval'd in void context\, and the current result of eval on the output is unspecified (and unclear\, hence this bug report). It's slightly bigger\, sure. But in the grand scheme of things?
It strikes me that with do blocks and appropriate lexicals one could even make terse output "work" correctly for self referential structures.
Nicholas Clark
Nicholas Clark wrote:
It strikes me that with do blocks and appropriate lexicals one could even make terse output "work" correctly for self referential structures.
This is what I'd like to see. In terse mode it makes a lot more sense for eval to return the structure created\, because there's no other way to get at the structure. Currently terse mode just isn't useful on anything tricky.
-zefram
Migrated from rt.perl.org#104906 (status was 'open')
Searchable as RT104906$