in reply to Loading/Unloading Modules?

Consider this litte program:
#!/usr/bin/perl use strict; use warnings; our $foo; sub do_something { $foo++; print "$foo\n"; } our $running; if (!$running) { $foo = 0; $running = 1; $SIG{INT} = sub {do $0}; for (;;) { sleep (1); do_something(); } }
This will output increasing numbers.
Now change its source code while it is running, for instance change "$foo++" to "$foo+=5". Then send the program a SIGINT by pressing ^C (don't know if this works on Windows). You will get a warning about a redefined subroutine, but then the program continues running with its old variables and a new do_something subroutine.
I experienced that this is particularly useful for programs like IRC bots to change the code without having to stop the programs.
If you put the subroutine into a module, you will probably be able to leave out the $running stuff and make everything simpler.

Replies are listed 'Best First'.
Re^2: Loading/Unloading Modules?
by toobored (Novice) on Apr 18, 2005 at 10:13 UTC
    Thanks for the reply - however the problem with this is that I deally I don't want to have to send a signal or anything each time I change code. Ideally the change over would be seemless - i.e. I copy the new module into place and it is automatically picked up next time that module is actually needed.

    This is different to the bot's config file which it reloads whenever I tell it too in the channel (what a good little bot).

    Playing around with a few things after everyone's answers I combined replies and came up with a veriant on davidrw's test script that uses Symbol::delete_package as well as deletes the module from %INC. Seems to work so far :)

    Now the big test is to get it going within my bot and it's framework.

    Thanks for everybodies help.