$value =~ s/\./->/g;
...
my $generator = eval "sub { $value }";
die if $@;
for (@rows) {
...
print $generator->();
...
}
####
# untested, just pseudo code
my @tokens;
local $_ = $value;
while ( !/\G$/gc ) { # while not at end of string
push @tokens,
/\G\./gc ? [ 'DOT', '.' ] :
/\G(\$\w+)/gc ? [ 'VAR', $1 ] :
/\G(\w+)\((.*?)\)/gc ? [ 'METHOD', $1, [ split /\s*,\s*/, $2 ] :
/\G(\w+)/gc ? [ 'METHOD', $1, [] ] :
...
last
}
####
# again, untested, just for demonstration
my $code = '';
for (@tokens) {
my ($type, $source, @params) = @$_;
if ($type eq 'VAR') {
$code .= $source;
}
elsif ($type eq 'DOT') {
$code .= '->';
}
elsif ($type eq 'METHOD') {
....
}
my $generator = eval "sub { $code }";
die if $@;
for (@rows) {
...
print $generator->();
...
}
####
my $generator = eval "sub { my (\$order, \$order_line) = @_; $code }";
...
$generator->($row->{order}, $row->{order_line});