Every subroutine is defined in the symbol table (or namespace) of a package, the default package being main. A subroutine can always be invoked or referenced using a fully-qualified subroutine name that includes the package. The following example does not cover the complete process of defining a standalone module, which you seem to understand, but should be enough to illustrate the principle of using a fully-qualified subroutine name. See perlmod.
>perl -wMstrict -le
"package Module1;
;;
sub main { print qq{hi from main($_[0]) in package }, __PACKAGE__; }
;;
package Module2;
;;
sub main { print qq{hi from main($_[0]) in package }, __PACKAGE__; }
;;
package main;
;;
my %pages = (
PG_1 => \&Module1::main,
PG_2 => \&Module2::main,
);
;;
my $pg = 'PG_2';
$pages{$pg}->(42);
"
hi from main(42) in package Module2
Update: Note that it's usually a Bad Idea to define a function with the same name as a very important global namespace, i.e., main. It is quite possible to keep everything straight, but you risk giving yourself a terrible headache.
| [reply] [d/l] [select] |
| [reply] |
Hi Anonymous,
...to a module's method when two modules have the same method name... But if there's a conflict of method names, is there a way to unambiguously call a module's method?...
Though you have been given a great answer, I consider it not over "stressed" to say your requirements taste like an Object-Oriented in IMHO. Since, the first two principle stated in perlobj answers thus:
1. An object is simply a data structure that knows to which class it belongs.
2. A class is simply a package. A class provides methods that expect to operate on objects.
So, awakening the Old dragon of OOP in Perl ( Yes, I know the "new" beasts ( Moose and it's different cousins ) are good extension of the Perl 5 object system ), one can do:
package Module1;
sub main {
my $obj = shift;
my $class = { name => __PACKAGE__, };
return bless $class, $obj;
}
package Module2;
sub main {
my $obj = shift;
my $class = { name => __PACKAGE__, };
return bless $class, $obj;
}
package main;
my $an1 = Module1->main();
print $an1->{name}, $/;
my $an2 = Module2->main();
print $an2->{name}, $/;
## And if you must use your dispatch table
## you can do
my %dispatch = (
main => Module1->main(),
another_page => Module2->main(),
);
print "Am in ", $dispatch{main}{name}, $/;
print "Am in ", $dispatch{another_page}{name};
NOTE:
All emphasis mine, to note my line of thought ( I hope, I didn't misinterpret the OP question)
both use warnings and strict were used though not stated.
If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me
| [reply] [d/l] |