Hello Monks,

I'm looking for nicer way, in pure Perl and standard library preferably, to get the address location of the actual data held by an SV.

I've implemented this ugly, regex-based hack below and it works, $ptr holds the actual address... but is there a better way?.

 use Data::Peek;
 my $buf = "hello world";
 my $dd = DDump( $buf );  # similar to Devel::Peek::Dump, but stringified
 my ($ptr) = $dd =~ /PV = (\S+)/; 
 $ptr = hex $ptr;  # $ptr had a string like "0x78ad928efff"

 use Devel::PeekPoke;
 print peek( $ptr, 4 );  # prints "hell", so it worked
Basically what I did was to capture the "PV = (...)" value out of the string with a regex. Here are the contents of the Devel::Peek::Dump():

SV = PV(0x7fea785135c0) at 0x7fea785264f0 REFCNT = 1 FLAGS = (PADMY,POK,pPOK) PV = 0x7fea70219200 "hello world"\0 CUR = 11 LEN = 16

In case you are curious, the reason for getting the address is due to the need to call an external (to perl) system that wants mem address and length of the byte sequence, not to use peek()/poke() or any other Perl code hack.

Maybe the solution is to bless $buf into B::SV, then call one of its methods? Like I said, I want to avoid XS, C or hopefully any outside dependencies.


In reply to Getting the PV pointer from a SV by rodd

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.