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.


In reply to Re: Calling PERL from C code - How to "build" a hash on the PERL stack before calling the function? by ikegami
in thread Calling PERL from C code - How to "build" a hash on the PERL stack before calling the function? by itamarat

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.