in reply to Marshalling Data
@data1 = ( 'one', 'won', [ 'two', 'too', 'to', \@data1 ] ); @data2 = @{$data1[2]};
Where should Perl get the information that the address of @data2 is the same as $data1[2] ? Interestingly, even specifying Data::Dumper->Purity(1) doesn't fix the problem. It changes the code to
@data1 = ( 'one', 'won', [ 'two', 'too', 'to', [] ] ); $data1[2][3] = \@data1; @data2 = @{$data1[2]};
If you don't use Dump but Dumper , you have to store array references, and everything works correctly:
package Refs { my $data1 = [qw[ one won ]]; my $data2 = [qw[ two too to ]]; push @$data2, $data1; push @$data1, $data2; open my $FH, '>', \ our $file; local $Data::Dumper::Varname = 'data'; local $Data::Dumper::Purity = 1; print {$FH} Data::Dumper::Dumper($data1, $data2); close $FH; Testing::recursive_data($data1, $data2); } package RefsBack { my ($data1, $data2); open my $FH, '<', \ $Refs::file; eval do { local $/; <$FH> }; Testing::recursive_data($data1, $data2); }
The corresponding code becomes
$data1 = [ 'one', 'won', [ 'two', 'too', 'to', [] ] ]; $data1->[2][3] = $data1; $data2 = $data1->[2];
You might try reporting a bug for the Dump method.
Update: Simulating the correct dumped string:
package Correct { my $string = '@data1 = ("one", "won", \@data2); @data2 = ( "two", "too", "to", \@data1);'; my (@data1, @data2); eval $string . ';1' or die $@; Testing::recursive_data(\@data1, \@data2); }
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Marshalling Data
by BillKSmith (Monsignor) on May 21, 2016 at 22:10 UTC |