Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: Calling PERL from C code - How to "build" a hash on the PERL stack before calling the function?

by ikegami (Patriarch)
on Jul 08, 2014 at 05:36 UTC ( [id://1092675]=note: print w/replies, xml ) Need Help??


in reply to Calling PERL from C code - How to "build" a hash on the PERL stack before calling the function?

Perl subs take a list of scalars for argument. You cannot pass a hash to a Perl sub as an argument. You may pass a reference

sub foo { my ($foo) = @_; print($foo->{bar}, "\n"); }

or you may pass the values needed to be build a hash

sub foo { my %foo = @_; print($foo{bar}, "\n"); }

but you cannot pass a hash. You probably want the former, as the latter is quite inefficient.


The sub expects a single scalar, so it probably expects a reference to a hash.

HV* hv = newHV(); SV* rv = newRV_noinc(hv); /* noinc to abandon our ref to the HV */ ... populate the hash using hv_store ... ... XPUSHs(sv_2mortal(rv)); /* Mortalize to abandon our ref to the RV */ ...

If you want both the RV and the HV to outlive the sub call, you'd use XPUSHs(rv). You'd also need to ensure the RV is freed later.

If you want the HV (but not the RV) to outlive the sub call, you'd use newRV_inc. You'd also need to ensure the HV is freed later.


Note that the name of the language is Perl (not PERL). It's not an acronym.

  • Comment on Re: Calling PERL from C code - How to "build" a hash on the PERL stack before calling the function?
  • Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1092675]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (6)
As of 2024-04-24 07:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found