hardburn has asked for the wisdom of the Perl Monks concerning the following question:

I have a case where I want to use a module containing a bunch of configuration information for the surrounding system. During testing, I call a special subroutine (_testing_on()) in a BEGIN block to use seperate settings (like connecting to a different database so the live one doesn't get written to).

Here's a one-liner that demonstrates the problem:

$ perl -e 'sub FOO () { 1 } BEGIN{ *FOO = sub () { 2 }; } print FOO;' Constant subroutine main::FOO redefined at -e line 1. 2

Normally, that warning is a very good idea, but in this case it just gets in the way.

How can I keep the inline-ableness of a sub NAME () { 1 } while still being able to redefine it under special circumstances without that warning? If necessary, I can live with not being inline, but it'd be really nice.

----
I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
-- Schemer

: () { :|:& };:

Note: All code is untested, unless otherwise stated

Replies are listed 'Best First'.
Re: Suppressing "Constant Subroutine Redefined" Error
by chromatic (Archbishop) on Nov 21, 2003 at 19:43 UTC

    localize the typeglob. Otherwise, use the warnings pragma to disable redefined warnings.

      Thanks. no warnings 'redefine'; does the job.

      ----
      I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
      -- Schemer

      : () { :|:& };:

      Note: All code is untested, unless otherwise stated

Re: Suppressing "Constant Subroutine Redeifined" Error
by perrin (Chancellor) on Nov 21, 2003 at 19:57 UTC
    Do you fully understand the reason for that warning? Perl is telling you that it may already have in-lined this sub and that your change is no longer guaranteed to actually change the value of FOO. You should only ignore this warning if you are certain that you are NOT changing the value of any constant subroutine.

      Yes, I understand. The change is being done at BEGIN time, which happens before any inlineing occurs. Further, it's only done for our test scripts, not the production environment.

      ----
      I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
      -- Schemer

      : () { :|:& };:

      Note: All code is untested, unless otherwise stated

Re: Suppressing "Constant Subroutine Redeifined" Error
by adrianh (Chancellor) on Nov 22, 2003 at 15:14 UTC

    I have to admit I'd probably switch to using a configuration file or environment variables - some easier mechanism to change for testing purposes. Overriding constant subs at compile time seems a little too needlessly complex for my tastes. But that's just me :-)