in reply to Re^2: How to safely use $_ in a library function?
in thread How to safely use $_ in a library function?

"There doesn’t appear to be any way to undo this effect. :-("

sub foo { Internals::SvREADONLY($_, 0); $_ = 'fred'; goto &bar; }

The intentionally-undocumented Internals package is part of Perl core (so much so that you don't even need to use it - it's completely internal, like parts of utf8 are) and has nothing much to do with the Internals module on CPAN.

use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Replies are listed 'Best First'.
Re^4: How to safely use $_ in a library function?
by Athanasius (Archbishop) on Sep 18, 2013 at 15:09 UTC

    Sounds good; but, if I add

    Internals::SvREADONLY($_, 0);

    to the code I gave above, immediately before the line $_ = 'fred';, I still get:

    1:03 >perl 723_SoPW.pl literal1 Modification of a read-only value attempted at 723_SoPW.pl line 26. 1:03 >perl -v This is perl 5, version 18, subversion 1 (v5.18.1) built for MSWin32-x +86-multi-thread-64int ...

    Also, where and how can I learn about a feature that is “intentionally-undocumented”? (This is a serious question!)

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      It reminds me more and more of code like this:

      10: A=2 20: B=4 30: GOTO 200 40: PRINT C 50: END 200: C=A+B 210: GOTO 40

      Really? I get this...

      You can see what Internals functions you have like this:

      perl -E'say for sort keys %Internals::'

      Many of these built-in functions, including stuff in the Internals, utf8, re and UNIVERSAL packages amongst others, are defined in the file universal.c in the Perl source code. Search in the file for the string "xsub_details" and you will find a list. That's not a comprehensive list though; Internals::V and mro::get_linear_isa are certainly missing.

      use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

        Yes, Internals::SvREADONLY is there all right:

        1:35 >perl -E "say for sort keys %Internals::" SvREADONLY SvREFCNT V hv_clear_placeholders 1:35 >

        But it doesn’t work for me. A Windows issue, maybe?

        Thanks for the information on where to find the Internals package in the source code.

        Update: I tried the Internals module, but that doesn’t work (for me, on Windows) either:

        :-(

        Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,