Checking for $@ after both evals will reveal:
Global symbol "$VAR1" requires explicit package name at (eval 1) line 1.
To fix you can prefix your eval'd code with a 'my':
use strict;
use Data::Dumper;
{
my $hashref = {
"aaa" => 1,
"bbb" => 2,
"ccc" => 3,
};
print "hashref : " . Dumper($hashref);
my $dumped = Dumper($hashref);
print "Dumped: $dumped\n";
my $restored = eval "my $dumped";
warn "\$@ = $@\n";
print "restored: " . Dumper($restored);
my $test_2 = eval("my ".Dumper($hashref));
warn "\$@ = $@\n";
print "test_2: " . Dumper($test_2);
}