http://www.perlmonks.org?node_id=297131


in reply to Embedded Perl Global Variables

Perhaps you know too much about the way perl stores variables. You do not need the global stash to create a global variable. This should do it:

SV *v = perl_get_sv("::variable", 1)

The second parameter is a boolean flag that controls whether perl should create the variable if it does not exist. Once you have the SV pointer, you can use the rest of the perlguts API to work with it. For example, you could set its value to 0:

perl_sv_setiv(v, 0)

The perl_get_* API works with package scoped "local" variables. Lexical variables are much harder to find -- there you do need to know a lot about scratchpads and how perl stores lexical variables.

The index for Advanced Perl Programming sucks. On page 331, table 20-1, there is a brief description of the perl_get_sv function.

The Jenness/Cozens book, Extending and Embedding Perl published by Manning, has much better coverage of the perl internals. The perlguts.pod docs distributed with Perl are quite good too.

Replies are listed 'Best First'.
Re: Re: Embedded Perl Global Variables
by blssu (Pilgrim) on Oct 07, 2003 at 01:17 UTC

    Sorry I didn't use a hash example like your problem. The code is very similar.

    HV *hash = perl_get_hv("Some::Module::TestGlobal", 1)

    See page 338 in Srinivasan or page 145 in Jenness/Cozens.

    One thing I didn't mention is that you must create the hash as a global variable -- don't use newHV. It doesn't matter if you create the global before or after loading your modules. I normally load my modules and then fetch the variables they define.

    If you use C++, you might find my libperl++ package helpful. It may be useful for code examples at any rate. Of course, as a recent thread points out, real perl hackers don't use C++... ;)

      Blssu - Thank you for the answers, and the libperl++ library. I used your first and second replys to solve all of the remaining issues in my code. I can actually get some sleep this evening!

      As you had guessed in your message, I was working on re-inventing the perl_get_hv() function (very much the hard way).