in reply to Re^2: question regarding "Tie" in Perl
in thread question regarding "Tie" in Perl

That's no excuse for implementing a constant using tie.

use strict; use warnings; Internals::SvREADONLY(my $answer = 42, 1); print "This interpolates: $answer\n"; $answer++; # dies
use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Replies are listed 'Best First'.
Re^4: question regarding "Tie" in Perl
by BrowserUk (Patriarch) on Nov 05, 2013 at 01:49 UTC

    Cool'n'all as that is, by deferring the construction of constants to runtime, you disavail yourself of various compile-time optimisations that Perl has.

    Even the very act of interpolating a read-only variable is an active pessimisation, as whilst perl will enforce the read-onliness, Perl does not (cannot) know that it need not re-interpolate the variable every time it is used:

    use constant CONSTANT => 10;; Internals::SvREADONLY( my $READONLY = 10, 1);; [Type of arg 1 to Internals::SvREADONLY must be one of [$%@] (not scal +ar assignment) at (eval 11) line 1, near "1)" $READONLY = 10; Internals::SvREADONLY( $READONLY, 1);; ++$READONLY;; [Modification of a read-only value attempted at (eval 13) line 1, <STD +IN> line 6. cmpthese -1,{ a=>q[ for(1..1000){ my $string = "the constant is " . CONSTANT . " +\n" } ], b=>q[ for(1..1000){ my $string = "the readonly is $READONLY\n"; } + ], };; Rate b a b 3893/s -- -46% a 7236/s 86% --

    A small a difference as that may be; it is all those avoidable small bits that add up.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.