in reply to readonly access to C-level strings

Recently I asked about how to provide read-only access to a bunch of C-level strings without copying them.

So, this is how it works:

sv=newSV(0); SvUPGRADE(sv, SVt_PV); SvPOK_only(sv); SvPV_set(sv, pointer); SvLEN_set(sv, 0); SvCUR_set(sv, length); SvREADONLY_on(sv);

pointer is the address of the first byte of the string and length its length.

The trick is the SvLEN_set(sv, 0) statement. It prevents Safefree() to be called on the pointer during destruction of the SV.

If you work with such variables and want to avoid copying even further in the perl code you have to be quite careful. A simple $x=$y or sub x {my ($x)=@_;} x($y) where $y is such a read-only SV will copy it.

So, I found the best way to avoid copying is to work with references: $x=\$y; substr $$x, ... or sub x {my ($x)=@_; substr $$x, ...} x(\$y)

Torsten

Replies are listed 'Best First'.
Re: [SOLUTION] readonly access to C-level strings
by Anonymous Monk on Jul 03, 2009 at 07:51 UTC

      ...or an update to the original post.

      ...roboticus