use Fcntl; # For O_RDWR, O_CREAT, etc. use SDBM_File; # 0666 reduced by umask. tie my%__intfactor, 'SDBM_File','/var/tmp/intfactor.sdbm', O_RDWR|O_CREAT, 0666) or { warn"Couldn't tie SDBM file '/var/tmp/intfactor.sdbm': $!"; warn"continuing with ramdb"; }; sub intfactor() { exists $__intfactor{%r} and return $__intfactor{%r}; $c -= 4096 while $c % $r; return $__intfactor{%r}=$c; } # I'm lost by the meaning of your code, where is $s used? $r = 12; $s = 2*1024**3; print intfactor($c,$r);