ttlgreen has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

Hopefully this isn't too dumb of a question. I have a script that runs an infinite loop that does useful things until I hit CTRL+C and kill it.

I'm using a text file to store an ID number for the next time the script starts. This ID number increases every time the loop cycles. Right now I'm opening and writing to the text file EVERY time the loop cycles. Writing to a file over and over again when it really only needs to be done once seems a little stupid to me.

Is there such a thing as DESTRUCTOR sort of thing I can use that would run a function when the script exits?

If not could I possibly assign a DESTRUCTOR to a regular scalar that doesn't belong to any particular object somehow?

The goal is to have a function that takes the said ID value and writes it to the text file just before the script exits regardless of why it exits.

Any hope for me?

Thanks ;-)

Replies are listed 'Best First'.
Re: Destructor() for a non OO script?
by ikegami (Patriarch) on Jan 21, 2009 at 04:49 UTC

    There is (END blocks), but it won't help you. SIGINT will force your script to exit immediately, unless you tell it otherwise by hooking into %SIG.

      Thank you very much! Looks like %SIG will be perfect for what I need.

      I do actually plan on adding a real user interface to this script someday... but for now I think that might be a little over my head ;)

Re: Destructor() for a non OO script?
by tilly (Archbishop) on Jan 21, 2009 at 04:47 UTC
    You can use an END block for this purpose. As long as you are just going to kill it with a CTRL+C this will work.

    But be warned that if it terminates more abruptly, for instance someone does a kill -9 or you link to a C library that segfaults, the END block will never have a chance to run.

    Update: Oops, ikegami is right. You do need to do more than just have an END block. My bad.

      Not from what I can observe

      $ perl -le'END { print "END" } sleep();' ^C $

      Am I doing something wrong?