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

Hello,

I am trying to create a simple Term::ReadLine based shell and I was wondering if there is any way to dynamically reload a file which has been required in the script(which might be cool for debugging...).

#!/usr/bin/perl -w require 'spamassassin.pm'; use Term::ReadLine; use Data::Dumper; my %subs = ( ); $term = new Term::ReadLine 'prep test'; my $attribs = $term->Attribs; # auto completion is working... $attribs->{completion_entry_function} = $attribs->{list_completion_fun +ction}; $attribs->{completion_word} = [keys %subs,'print','n','Dumper','shp']; + my $OUT = $term->OUT || \*STDOUT; while( defined($_ = $term->readline("prep test shell >")) ) { last if /^\s*qu?i?t?$/i; # "quit" my $res = eval($_); warn $@ if $@; }

Here, it would be nice to be able to reload the spamassassin.pm file, if, per example I've made some changes to it, but I don't want to quit the shell...

Thanks in advance.

Replies are listed 'Best First'.
Re: Reloading a file, required by a Term::Readline based shell
by moritz (Cardinal) on Mar 06, 2008 at 12:26 UTC
    You could try
    delete $INC{'spamassassin.pm'}; require 'spamassassin.pm';
    (haven't checked if this works, so try it out first ;)
      do $INC{'spamassasin.pm'};
Re: Reloading a file, required by a Term::Readline based shell
by qaz (Sexton) on Mar 06, 2008 at 13:31 UTC

    Well, I've created a small sub:

    sub reload { delete $INC{'spamassassin.pm'}; require 'spamassassin.pm'; }

    and it seems to work fine. I got the subs redifined...

    prep test shell >reload Subroutine spamassassin_report redefined at spamassassin.pm line 14. Subroutine spamassassin_graph redefined at spamassassin.pm line 56.

    If I use do, I get a warning...

    prep test shell >reload Use of uninitialized value in do "file" at ./shell.pl line 46. Null filename used at ./shell.pl line 46.