Date sent: Mon, 04 Feb 2002 11:27:38 -0800 From: Tarak Parekh <[EMAIL PROTECTED]> > I was a little confused regarding scopes of packages. I did read > portions of > Programming Perl but am still a little unclear. > > Basically, I am trying to implement a simple form of RPC in which a > command takes in a function name and passes it across to a daemon. The > daemon using symbolic referencing invokes the function. > > the daemon sources in 3 libraries (use A; use B; use C;) > Let's say A contains functions - foo, bar > and B contains functions - foofoo, barbar > C contains functions - morefoo, morebar > > The daemon's top few lines look like > ---------- > package daemon; > > use strict; > > use A; > use B; > use C; > > A.pm's top few lines look like > ---------- > package A; > > use strict; > > use vars qw(@ISA @EXPORT);
You forgot to require Exporter; > @ISA = qw (Exporter); > @EXPORT = qw (foo bar); > > sub foo > { > print "foo called\n"; > } > > sub bar > { > print "bar called\n"; > } > > The questions I had were > 1. To invoke a function (for e.g. foo) - what do i send across from > the client > command ? - daemon::foo ? A::foo ? or just foo ? Either A::foo or foo. Since the A package uses Exporter and includes the foo() in the @EXPORT list whenever you "use A" the foo() gets exported to current package ... that is an alias is made so that foo() is the same as A::foo(). > - I guess my > question is > once you 'use' a package what happens to all the symbols from that > package. > Do they become part of the importing package ? Depends. They do not have to. 1) If the package uses Exporter and you did not specify any parameters to the "use A" statement all functions and variables mentioned in @A::EXPORT are imported. 2) If you do use a parameter like this: use A qw(foo); then Exporter looks whether A agrees with exporting foo() = looks whether @EXPORT_OK has an element "foo" and if it does imports ONLY that function. Otherwise gives you an error. 3) If neither the package or the packages specified in @ISA use Exporter or a similar module and doesn't contain import() function .... nothing gets imported at all. 4) If the package or one of those in @ISA contains an import() function ... then the package may export anything it likes. Read it's docs. > 2. A followup question is that if B and/or C had the same name > subroutines > as A.pm did then what would happen. If you were running the script with -w parameter you'd get a warning: Subroutine foo redefined at ... line .... In that case you'd most probably want to set @EXPORT_OK and only import the functions you want from each package. Hope that makes sense, Jenda =========== [EMAIL PROTECTED] == http://Jenda.Krynicky.cz ========== There is a reason for living. There must be. I've seen it somewhere. It's just that in the mess on my table ... and in my brain. I can't find it. --- me -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]