What our does is binds the package variable to lexical scope. So a package after an our doesn't change the variable. But if you have the our *after* the package then it will bind the correct package. So in your eval put the package statement before our %map and you'll be fine.
Incidentally if you are using eval in this horrible way, I strongly recommend studying http://perldoc.perl.org/perlsyn.html#Plain-Old-Comments-(Not!) for how to make it clear in any error messages where your subroutines were actually defined. On Wed, Oct 29, 2014 at 11:47 AM, Morse, Richard E.,MGH <[email protected]> wrote: > Hi! I'm running into an odd desire, and I'm hoping someone here can at least > tell me where to look, as so far Google and DDG are not telling me what I > want. > > I have a bunch of modules which have the same subroutines in each. Mostly, > the code for the subroutines is the same, but there is a chance that any > particular subroutine might be slightly different in any module (the context > here involves internationalization). So, for instance: > > package PKG::en_US; > our %map; > sub handle_ages { ; } > sub handle_dests { ; } > > package PKG::fr; > our %map; > sub handle_ages { ; } > sub handle_dests { ; } > > package PKG::pt_BR; > our %map; > sub handle_ages { ; } > sub handle_dests { ; } > > What I want to do is be able to create a base module, something like > > package PKG::_base; > sub handle_ages { ; } > sub handle_dests { ; } > > I could then define the rest of them as > > package PKG::en_US; > our %map; > > package PKG::fr; > our %map; > sub handle_dests { ; } > > package PKG::pt_BR; > our %map; > > Then use some kind of symbol table mungery to add the undefined functions to > each package. > > This I can do. > > However, where I need help, is that I want to be able to have the package > variable "%map" be properly used by the functions added to each package. That > is, if I call PKG::en_US::handle_ages, it should use %PKG::en_US::map, not > (the nonexistant) %PKG::_base::map. > > I've tried various things, but from what I can understand, even with > everything declared "our", the sub definition closes over the package that > it's in when defined. I've seen references to doing an `eval ("package > $package; sub handle_ages { ; }")`, but this makes maintaining everything > much harder, as I now don't have a base module, but rather a bunch of text > strings. > > Thanks, > Ricky > > > The information in this e-mail is intended only for the person to whom it is > addressed. If you believe this e-mail was sent to you in error and the e-mail > contains patient information, please contact the Partners Compliance HelpLine > at > http://www.partners.org/complianceline . If the e-mail was sent to you in > error > but does not contain patient information, please contact the sender and > properly > dispose of the e-mail. > > > _______________________________________________ > Boston-pm mailing list > [email protected] > http://mail.pm.org/mailman/listinfo/boston-pm _______________________________________________ Boston-pm mailing list [email protected] http://mail.pm.org/mailman/listinfo/boston-pm

