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