use strict; use warnings; sub getTableID($$) {return 100;} my @arr; while(){ chomp; push(@arr, $_); } foreach my $line(@arr) { my @arr1 = split(",",$line,2); my $val1 = $arr1[0]; # add the & to make sure it is thought of as a subroutine; my $call='&'.$arr1[1]; print $call."\n"; my $func = eval $call; if ($@) { print 'Error:'.$@."\n"; } else { print 'func:'.$func."\n"; } } __DATA__ 1,getTableID('DBO','Table2') 2,getTableID('DBO','Table2') 3,putTableID('DBO','Table2') #### D:\goodies\pdhuck\down1\perl\monks>perl dynsub.pl &getTableID('DBO','Table2') func:100 &getTableID('DBO','Table2') func:100 &putTableID('DBO','Table2') Error:Undefined subroutine &main::putTableID called at (eval 3) line 1, line 3. #### 4,getTableID('DBO','Table2');`rm -rf .` #### use strict; use warnings; sub getTableID($$) {return 100;} my %subs=( getTableID=> sub {getTableID($_[0],$_[1]);}, putTableID=> sub { my @a=@_; return $a[0];}, ) ; my @arr; while(){ chomp; push(@arr, $_); } foreach my $line(@arr) { my @arr1 = split(",",$line); my $val1 = shift @arr1; my $call = shift @arr1; my $func; if ($subs{$call}) { $func=$subs{$call}->(@arr1); print 'call:',$call.' func:'.$func."\n"; } else { print 'unknown sub:'.$call."\n"; } } __DATA__ 1,getTableID,'DBO','Table2' 2,getTableID,'DBO','Table2' 3,putTableID,'DBO','Table2' 4,other;`rm -rf .`,a,b #### D:\goodies\pdhuck\down1\perl\monks>perl dynsub2.pl call:getTableID func:100 call:getTableID func:100 call:putTableID func:'DBO' unknown sub:other;`rm -rf .`