http://www.perlmonks.org?node_id=1022930


in reply to marshalling data

If you take a look at the $marshall_data variable, it contains this line:

@data2 = @{$data1[2]};

This makes @data2 into a shallow clone of @{$data1[2]} - i.e. they are now different arrays. :-(

I can get it to work if I serialize to arrayrefs rather than arrays. (PS: it's not that much work to get it to run under strict too!)

use v5.14; use strict; # redundant! use warnings; use Data::Dumper; package main { our @data1 = qw(one won); our @data2 = qw(two too to); push @data2, \@data1; push @data1, \@data2; open my $FH, '>', \(our $marshall_data); print {$FH} Data::Dumper->Dump( [ \@data1, \@data2 ], [qw($data1 $data2)] ); close $FH; print "NO " if \@data2 != $data1[2]; print "CIRCULAR DATA STRUCTURE in package main\n"; } package Other { open my $FH, '<', \$main::marshall_data; my $string = do {local $/ = undef; <$FH>}; close $FH; our (@data1, @data2); (*data1, *data2) = do { my ($data1, $data2); # declare eval $string; ($data1, $data2); }; die "$@\n" if $@; print "NO " if \@data2 != $data1[2]; print "CIRCULAR DATA STRUCTURE in package other\n"; print \@data2, ' ', $data1[2], "\n\n"; }
package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name