sub do_or_log_error { my $coderef = shift; my $syslogger = shift; my $param = shift; eval { $coderef->($param) }; if ($@) { $syslogger->LOG('error', "$param: $@"); } } sub my_rmtree { # yours was infinite loop! do_or_log_error(\&rmtree, @_); } sub my_unlink { # yours was infinite loop! do_or_log_error(sub { unlink @_ }, @_); }