I have a perl script which automates a ton of database administration work. Much of the logic is duplicated between many of the tasks, so I am using subroutine references extensively to plug in the appropriate custom code where necessary. Since these databases exist in a production environment, audit logs are an absolute necessity. It would be nice to have the names of the subroutines (called by reference) present in the log files.
My question is given a subroutine reference, is it possible to determine the original name of the routine so that it may be placed in the log? Since subroutine references may point to anonymous blocks of code, I suspect that it's not.
As a work-around, I've found that it's possible to pass the subroutine names as text strings. When they're passed into a routine, I check whether they're a scalar (string sub name) or subroutine reference with ref(). If they're a text name, it's easy enough to generate the reference with an eval(), and I can stuff the original name away for later reference.