in reply to Rename/Relocate A Module

You could associate both package names with the same symbol table.
package New::MyModule; *Old::MyModule:: = \*New::MyModule::; ... 1;

Update: Added missing trailing colons. Tested:

use strict; use warnings; BEGIN { package New::MyModule; *Old::MyModule:: = \*New::MyModule::; sub foo { print @_ } 1; } New::MyModule::foo("new\n"); Old::MyModule::foo("old\n");

Replies are listed 'Best First'.
Re^2: Rename/Relocate A Module
by ig (Vicar) on Nov 07, 2008 at 04:36 UTC

    Update: After further testing, I don't think this is a good solution. The symbol tables do not behave as I thought they would.

    Or, for more segregation between the old and new modules, you can copy the entire symbol table.

    #!/usr/bin/perl use strict; use warnings; BEGIN { package New::MyModule; *Old::MyModule:: = \*New::MyModule::; %My::Other::Name:: = %New::MyModule::; sub foo { print @_ } 1; } New::MyModule::foo("new\n"); Old::MyModule::foo("old\n"); My::Other::Name::foo("other\n"); $New::MyModule::extra1 = 'set as $New::MyModule::extra1'; $Old::MyModule::extra2 = 'set as $Old::MyModule::extra2'; $My::Other::Name::extra3 = 'set as $My::Other::Name::extra3'; # This is to avoid warnings about the above being used only once my @array = ( $New::MyModule::extra1, $Old::MyModule::extra2, $My::Other::Name::extra3, ); print "\nNew::MyModule:\n"; foreach my $key (keys %New::MyModule::) { print "$key: $New::MyModule::{$key}\n"; } print "\nOld::MyModule:\n"; foreach my $key (keys %Old::MyModule::) { print "$key: $Old::MyModule::{$key}\n"; } print "\nMy::Other::Name:\n"; foreach my $key (keys %My::Other::Name::) { print "$key: $My::Other::Name::{$key}\n"; }

    Which produces:

    new old other New::MyModule: extra2: *New::MyModule::extra2 extra1: *New::MyModule::extra1 foo: *New::MyModule::foo Old::MyModule: extra2: *New::MyModule::extra2 extra1: *New::MyModule::extra1 foo: *New::MyModule::foo My::Other::Name: extra3: *My::Other::Name::extra3 foo: *New::MyModule::foo