sub make_private_var_with_accessors { my $var; ( sub { my $val = $var; $val }, # getter sub { $var = shift } # setter ) } my($get,$set) = make_private_var_with_accessors(); $set->(42); print "=".$get->()."\n"; #### { package PrivateVariable; sub new { my $pkg = shift; my $var; bless { get => sub { my $val = $var; $val }, set => sub { $var = shift }, }, $pkg } sub get { $_[0]->{get}->() } sub set { $_[0]->{set}->($_[1]) } } my $pv = new PrivateVariable; $pv->set(666); print "=".$pv->get()."\n";