use Data::Dump qw(dump); my @dna = qw(A T T G C); print +(dump \@dna),$/; my @view; make_view( \@dna, 1, \@view, 0 ); make_view( \@dna, 2, \@view, 1 ); #mutate $view[0] = 'x'; $view[1] = 'x'; print +(dump \@dna), $/; make_view( \@dna, 4, \@view, 0 ); print +(dump \@dna), $/; # print ["A", "T", "x", "G", "x"] sub make_view { my ($arr, $idx1, $view, $idx2) = @_; tie $view[$idx2], 'Overridden', sub : lvalue { $arr->[$idx1] }; return; } { package Overridden; sub TIESCALAR { my ($class, $item) = @_; return bless \$item, $class; } sub FETCH { my $self = shift; ${$self}->(); } sub STORE { my $self = shift; my ($val) = @_; ${$self}->() = $val; } }