Thanks -- I see how to do this with a string eval, but I'm hoping to avoid 
having to keep the functions as text strings.

If I can't find any other way, it's what I will have to fall back on, but I'm 
hoping there's some way to avoid this.

Ricky

On Oct 29, 2014, at 2:56 PM, Ben Tilly <[email protected]> wrote:

> 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

Reply via email to