in reply to Loading/Unloading Modules?

I don't know much about the inner workings of modules & loading/unloading, but this appears to work:
This is X1.pm:
package X; sub new { my $self = shift; printf "new() v1\n"; return bless {}, $self; } sub blah { printf "blah v1\n"; } 1;
This is X2.pm:
package X; sub new { my $self = shift; printf "new() v2\n"; return bless {}, $self; } sub blah { printf "blah v2\n"; } 1;
This is the test script, x.pl:
#!/usr/bin/perl use lib '.'; use X; my $x1 = X->new(); $x1->blah; printf "Copying in X2.pm\n"; system("cp X2.pm X.pm"); printf "Trying X.pm\n"; eval `cat X.pm`; $x1->blah; my $x2 = X->new();
And this is the execution and output:
[me@host tmp]$ cp X1.pm X.pm [me@host tmp]$ ./x.pl new() v1 blah v1 Copying in X2.pm Trying X.pm blah v2 new() v2
While it didn't work for we to just 'use' or 'require' the modules again (i didn't really except it to, especially 'use' since that's done early on), it appears to work to eval in the new module. Is this a good or a horrible implementation/usage? I really can't say--hopefully someone wiser will comment...

Replies are listed 'Best First'.
Re^2: Loading/Unloading Modules?
by chromatic (Archbishop) on Apr 16, 2005 at 06:32 UTC

    You have to delete the filename and filepath from %INC for use or require to work:

    use X2; print "Reusing X2\n"; delete $INC{'X2.pm'}; require X2;