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 | [reply] [Watch: Dir/Any] [d/l] |
use Scalar::Readonly qw/ readonly_on /;
use Devel::Peek qw/ Dump /;
my $f=66;
readonly_on($f);
Dump($f);
__END__
SV = IV(0x99ba38) at 0x99ba3c
REFCNT = 1
FLAGS = (PADMY,IOK,READONLY,pIOK)
IV = 66
Scalar::Readonly::readonly also simply checks for SvREADONLY flag, and no others (no FAKE), so it'll be a false positive on HASH keys | [reply] [Watch: Dir/Any] [d/l] |
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.
| [reply] [Watch: Dir/Any] [d/l] [select] |