package Person; use warnings; use strict; our $address_1 = "foo"; our $address_2 = "bar"; our $address_3 = "baz"; 1; package MyPerson; use strict; use warnings; use Data::Alias; my %address; foreach my $var (keys %Person::) { next unless $var =~ m/^address_(\d+)$/; alias $address{$1} = do { no strict 'refs'; ${"Person::${var}"} }; } sub get_address { return $address{shift()} } sub exists_address { return exists $address{shift()} } sub set_address { my ($num, $value) = @_; return $address{$num} = $value; } 1; package main; use strict; use warnings; print "address_1: ", MyPerson::get_address(1), "\n"; print "Setting address_1 to foofoo\n"; MyPerson::set_address(1, 'foofoo'); print "address_1 now contains: ", MyPerson::get_address(1), "\n"; print "Because we created an alias, \$Person::address_1 also changed to ", $Person::address_1, "\n\n"; print "Iterate through all Person address_Ns\n"; for (1..3) { print MyPerson::get_address($_), "\n"; } #### address_1: foo Setting address_1 to foofoo address_1 now contains: foofoo Because we created an alias, $Person::address_1 also changed to foofoo Iterate through all Person address_Ns foofoo bar baz