package Foo; use warnings; use strict; my %data = qw/foo bar/; our $AUTOLOAD; sub AUTOLOAD { my ($self, @args) = @_; my ($pkg, $field) = (__PACKAGE__, $AUTOLOAD); $field =~ s/${pkg}:://; ## uncommenting any of these, makes the code work #%data; #() = %data; #map $_, %data; #map $_, \%data; #$::qwerty123 = %data; eval "*$field = sub { return \\%$field; };"; $@ and die "eval failed: $@\n"; goto &$field; } 1; #### $ perl -I. -MData::Dumper -MFoo -e'print Dumper (Foo->data)' Variable "%data" is not available at (eval 1) line 1. $VAR1 = {}; #### $ perl -I. -MData::Dumper -MFoo -e'print Dumper (Foo->data)' Useless use of private hash in void context at Foo.pm line 16. $VAR1 = { 'foo' => 'bar' }; #### package main; use warnings; use strict; use Data::Dumper; print Dumper (Foo->data);