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

Really? I get this...

#!/usr/bin/env perl use strict; use warnings; for (qw(literal1 literal2 literal3)) { print "$_\n"; foo('wilma'); } sub foo { Internals::SvREADONLY($_, 0); $_ = 'fred'; goto &bar; } sub bar { my ($name) = @_; print "foo --> name = $name, \$_ = $_\n"; } __END__ literal1 foo --> name = wilma, $_ = fred literal2 foo --> name = wilma, $_ = fred literal3 foo --> name = wilma, $_ = fred

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

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

    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,

      Does Const::Fast work for you?

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

        Yes, it seems to work as advertised:

        17:39 >perl -Mstrict -wE "my $s = 42; say $s; ++$s; say $s;" 42 43 17:39 >perl -Mstrict -MConst::Fast -wE "const my $s => 42; say $s; ++$ +s; say $s;" 42 Modification of a read-only value attempted at -e line 1. 17:39 >

        How does that help?

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