If I were you, and were a unix man (the two being somewhat redundant), then I'd look at using a sepperate process to that running perl, and using the ptrace system call (probably from C) to periodicly find the curop. You'll have to be able to find the address of the curop variable, which probably means using a perl compiled for debugging. Note that this requires a fair bit of system-specificness (ptrace(2) is documented, on linux, as conforming to a fair number of standards, and being quite system specific. Win32, OTOH, does it's debugging in a completely different way.)
This would allow you to use all the normal methods to sleep, write, whatever. It, however, has a fair bit of slowness associated with it.