in reply to Constant redefined
The answer to this question is found in constant (the documentation for the constant pragma), where it states:
In the current implementation, scalar constants are actually inlinable subroutines. As of version 5.004 of Perl, the appropriate scalar constant is inserted directly in place of some subroutine calls, thereby saving the overhead of a subroutine call. See "Constant Functions" in perlsub for details about how and when this happens.
That statement means that constants are both declared at, and solidified at compiletime, and cannot be altered. You would literally have to go back and alter all the inlined values in the compiled code at runtime. Constants are...constant. ;)
The fact that constants are translated into inline values instead of the subroutine calls that they "look" like means that even if you tried to assign a new subroutine to the typeglob by which the constant is named, you can't. The typeglob for the sub seems to be forever tied to that inlined value.
Of course if you read on in the docs to the BUGS section you'll find the following:
In the current version of Perl, list constants are not inlined and some symbols may be redefined without generating a warning.
Exploiting that bug should not be for the faint of heart. In fact, exploiting it should just not ever be done, because its possible the behavior will go away if someone decides to fix that bug.
Dave
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Constant redefined
by paulski (Beadle) on May 31, 2005 at 04:43 UTC | |
by davido (Cardinal) on May 31, 2005 at 05:20 UTC | |
by holli (Abbot) on May 31, 2005 at 05:06 UTC |