Always better to wrap in a subroutine.
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;
}
}
But, that's what I would do.
My criteria for good software:
- Does it work?
- Can someone else come in, make a change, and be reasonably certain no bugs were introduced?
|