Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

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

by Anonymous Monk
on Dec 17, 2013 at 01:21 UTC ( [id://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

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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1067405]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (6)
As of 2024-04-25 11:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found