Although it's tempting to use eval in a situation like this,
I prefer (ab)using coderefs, either by employing a hash of anonymous subs
(rather than subs proper)...
package atm;
my %code = (
var1 => sub { print 1 },
var2 => sub { print 2 },
# ...
varN => sub { print N },
);
package main;
if ( exists $atm::code{$varN} ) {
$atm::code{$varN}->( object_vars($var1) );
} else {
# no matching sub
}
... or testing for the existance of the sub you want to run with can, and executing the coderef it returns.
if ( my $sub = atm->can($varN) ) {
$sub->( object_vars($varN) );
} else {
# no matching sub
}
--k.