narse has asked for the wisdom of the Perl Monks concerning the following question:

H All, I am having problems determining if a SV * points to a valid scalar. This example illustrates the problem:
void test() PREINIT: SV *scalar; CODE: if ( scalar == NULL ) // fixed std::cout << "NULL\n" if ( SvOK( scalar ) ) // fixed std::cout << "OK\n"
This example prints "OK". The easy solution for this example is to manually set scalar = NULL but I cannot do this. My hope is to handle perl hash arguments by stuffing them into a map:
void test( ... ) PREINIT: std::map< std::string, SV *> args; INIT: for ( int i = 1; i < items; i += 2 ) args[ SvP_nolen( ST(i) ) ] = ST( i + 1 ); CODE: std::cout << "The value of `foo' is " << SvP_nolen( args["foo"] ) << "\n";
In this example, if the foo argument was never given, the map will return the default value for a SV * which will point to nothing.

I need to be able to test if a SV * has never been set. I was hoping that SvOK would not only tell me if the scalar was defined but if such a scalar existed. I can't find anything in perlguts that satisfies this requirement.

Does anyone know how to test if a SV * points to a valid scalar, or to test if a SV * has never been set?

Thanks in advance.

Replies are listed 'Best First'.
Re: XS/Guts and unset scalar pointers
by ysth (Canon) on Apr 04, 2005 at 14:36 UTC
    In your first example, you seem to be using SV where you should be using scalar; doesn't if ( scalar == NULL ) do what you want?
      Oops... The example has been fixed now, sorry. I didn't want to copy/paste because my code is a bit more elaborate than the example needs to be.
Re: XS/Guts and unset scalar pointers
by narse (Pilgrim) on Apr 04, 2005 at 15:32 UTC
    As it has been pointed out, there are solutions that do not have any relation to tests within the perl guts. I am however, still interested if there is a `correct' way to test for such a thing. I do not know how perl variables are stored internally, it may be easy or difficult to test this on the perl side. Is it worth having a facility built into perl to test this?