You could use closures, as has already been mentioned, or
you could use tie. Something like this might work for
you... I don't know.
package Product;
use Tie::Array;
@ISA = qw/Tie::StdArray/;
use strict;
sub TIEARRAY {
my $class = shift;
bless [ @_ ], $class;
}
sub FETCH {
my $them = shift;
my $index = shift;
return $index >= @$them ?
eval join '*', @$them :
$them->[$index];
}
package main;
## Initialize your array with 2 elements, 8 and 2
tie my @p, 'Product', 8, 2;
print $p[2], "\n";
## Change the second element to 5
$p[1] = 5;
print $p[2], "\n";
## You can even add new elements to the array; now
## you need to use $p[3] to get the product
push @p, 10;
print $p[3], "\n";
This is, admittedly, pretty hackish. But it works. :)
Output:
16
40
400
If you try to access any element beyond the end of the array,
it returns the product of the elements in the array. Admittedly, I
don't really like those semantics much--anyone have any
better ideas? | [reply] [d/l] [select] |
my $array = [ 5, 5 ];
$array->[2] = sub { $array->[0] * $array->[1] };
print &{$array->[2]}; # 25
$array->[1] = 10;
print &{$array->[2]}; # 50
Is this good enough?
Update: You could also use eval:
$array->[2] = '$array->[0] * $array->[1]';
print eval $array->[2];
--
Casey
| [reply] [d/l] [select] |
i think this should work. make $array2 hold a subroutine closure. this way, every time you call $array2, the closure will be re-evaluated. | [reply] |