Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

XS/Guts and unset scalar pointers

by narse (Pilgrim)
on Apr 04, 2005 at 13:48 UTC ( [id://444680]=perlquestion: print w/replies, xml ) Need Help??

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?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://444680]
Approved by Joost
Front-paged by Courage
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2024-04-19 11:49 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found