Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re: Readonly problems (Devel::Peek, Scalar::Util::readonly bug)

by Anonymous Monk
on Dec 17, 2013 at 01:21 UTC ( #1067405=note: print w/ replies, xml ) Need Help??


in reply to Readonly problems

hash keys are read-only but they're not really readonly ... so Scalar::Util::readonly has bug in that it doesn't document the nuances of readonlyness :)

#!/usr/bin/perl -- use strict; use warnings; use Devel::Peek qw/ Dump /; use Readonly; Readonly::Scalar my $rs => 66; my %hh = qw/ A B /; while( my( $k, $v ) = each %hh ){ Dump( $k ); Dump( $v ); } for( 1 ){ Dump( $_ ); ## the readonliest } Dump( $rs ); __END__
SV = PV(0x3f7b44) at 0x99b8ac
  REFCNT = 1
  FLAGS = (PADMY,POK,FAKE,READONLY,pPOK)
  PV = 0x99ce88 "A"
  CUR = 1
  LEN = 0
SV = PV(0x3f7b4c) at 0xaca8bc
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0xadf504 "B"\0
  CUR = 1
  LEN = 12
SV = IV(0xae0670) at 0xae0674
  REFCNT = 2
  FLAGS = (PADTMP,IOK,READONLY,pIOK)
  IV = 1
SV = PVMG(0xad50e4) at 0x3f9bac
  REFCNT = 1
  FLAGS = (PADMY,GMG,SMG,RMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x99402c
    MG_VIRTUAL = &PL_vtbl_packelem
    MG_TYPE = PERL_MAGIC_tiedscalar(q)
    MG_FLAGS = 0x02
      REFCOUNTED
    MG_OBJ = 0x3f9adc
    SV = IV(0x3f9ad8) at 0x3f9adc
      REFCNT = 1
      FLAGS = (ROK)
      RV = 0xad353c
      SV = PVMG(0xad50c4) at 0xad353c
        REFCNT = 1
        FLAGS = (PADMY,OBJECT,IOK,pIOK)
        IV = 66
        NV = 0
        PV = 0
        STASH = 0xacab0c        "Readonly::Scalar"

Oh, and http://perldoc.perl.org/perlapi.html#sv_magic is unreadable ...

http://search.cpan.org/dist/illguts/index.html, redefining Internals::SvREADONLY


Comment on Re: Readonly problems (Devel::Peek, Scalar::Util::readonly bug)
Download Code
Replies are listed 'Best First'.
Re^2: Readonly problems ( Scalar::Readonly::readonly )
by Anonymous Monk on Dec 17, 2013 at 01:35 UTC
      Thanks, I don't really want to use readonly() though, I was just tracking down a bug involving DBI/DBD::Oracle. I tracked it down to code that went something like:
      my $data = {}; my $sth = $dbh->prepare($sql); $sth->bind_param_inout(':foo' => \$data->{foo}, 10); while ( my ($k, $v) = each %hash ) { $data->{foo} = $k; $sth->execute(); }
      And I got a 'modification of readonly value' error on the execute. Workaround is to modify the 'readonly' value before the execute with something like:
      $k .= '';
      Update: And for now, that whole thing needs a reset every few iterations, as execute() leaks memory with inout parameters.

      Update2: And the previously mentioned 'leak' has been fixed in the latest release.

        Would the following also work?
        $data->{foo} = "$k";
        لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1067405]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (8)
As of 2015-07-08 01:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (93 votes), past polls