What you really want is for each element of your matrix to be dynamically calculated — like a spreadsheet. You need to overload the way perl indexes the matrix. For that, you want Tie::Array, actually Tie::StdArray in particular. Then just alter the way the package works to suit your needs.
In this case, you want to store expressions at each index and evaluate them on the fly. I admit to thinking that wasn't possible in perl for a couple days, but tye straightened me out (ironically/punny) in the CB. I felt rather foolish about it actually.
use warnings;
use strict;
my @matrix;
tie @matrix, 'my_spreadsheet_matrix', (
[ '$x', '$y' ],
[ '$x+1', '$y+1' ],
[ '$x+7', '$y+7' ],
);
my ($x, $y) = (7, 9);
print "$matrix[1][1]\n";
($x, $y) = (13, 27);
print "$matrix[1][1]\n";
exit 0;
package my_spreadsheet_matrix;
use warnings;
use strict;
use Tie::Array;
use base 'Tie::StdArray';
1;
sub FETCH {
my $this = shift;
my $that = $this->SUPER::FETCH(@_);
return $that if ref $that;
$that = eval $that; die $@ if $@;
return $that;
}
sub TIEARRAY {
my $class = shift;
my $this = bless [], $class;
for my $e (@_) {
if( ref $e ) {
tie @$e, $class, @$e;
}
+
push @$this, $e;
}
return $this;
}