perlembed.html
来自「perl教程」· HTML 代码 · 共 795 行 · 第 1/5 页
HTML
795 行
<pre>
/usr/opt/perl5/CORE</pre>
<p>Execute this statement for a hint about where to find CORE:</p>
<pre>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">MConfig</span> <span class="keyword">-e</span> <span class="string">'print $Config{archlib}'</span>
</pre>
<p>Here's how you'd compile the example in the next section,
<a href="#adding_a_perl_interpreter_to_your_c_program">Adding a Perl interpreter to your C program</a>, on my Linux box:</p>
<pre>
% gcc -O2 -Dbool=char -DHAS_BOOL -I/usr/local/include
-I/usr/local/lib/perl5/i586-linux/5.003/CORE
-L/usr/local/lib/perl5/i586-linux/5.003/CORE
-o interp interp.c -lperl -lm</pre>
<p>(That's all one line.) On my DEC Alpha running old 5.003_05, the
incantation is a bit different:</p>
<pre>
% cc -O2 -Olimit 2900 -DSTANDARD_C -I/usr/local/include
-I/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE
-L/usr/local/lib/perl5/alpha-dec_osf/5.00305/CORE -L/usr/local/lib
-D__LANGUAGE_C__ -D_NO_PROTO -o interp interp.c -lperl -lm</pre>
<p>How can you figure out what to add? Assuming your Perl is post-5.001,
execute a <code>perl -V</code> command and pay special attention to the "cc" and
"ccflags" information.</p>
<p>You'll have to choose the appropriate compiler (<em>cc</em>, <em>gcc</em>, et al.) for
your machine: <code>perl -MConfig -e 'print $Config{cc}'</code> will tell you what
to use.</p>
<p>You'll also have to choose the appropriate library directory
(<em>/usr/local/lib/...</em>) for your machine. If your compiler complains
that certain functions are undefined, or that it can't locate
<em>-lperl</em>, then you need to change the path following the <code>-L</code>. If it
complains that it can't find <em>EXTERN.h</em> and <em>perl.h</em>, you need to
change the path following the <code>-I</code>.</p>
<p>You may have to add extra libraries as well. Which ones?
Perhaps those printed by</p>
<pre>
<span class="variable">perl</span> <span class="operator">-</span><span class="variable">MConfig</span> <span class="keyword">-e</span> <span class="string">'print $Config{libs}'</span>
</pre>
<p>Provided your perl binary was properly configured and installed the
<strong>ExtUtils::Embed</strong> module will determine all of this information for
you:</p>
<pre>
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`</pre>
<p>If the <strong>ExtUtils::Embed</strong> module isn't part of your Perl distribution,
you can retrieve it from
<a href="http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/">http://www.perl.com/perl/CPAN/modules/by-module/ExtUtils/</a>
(If this documentation came from your Perl distribution, then you're
running 5.004 or better and you already have it.)</p>
<p>The <strong>ExtUtils::Embed</strong> kit on CPAN also contains all source code for
the examples in this document, tests, additional examples and other
information you may find useful.</p>
<p>
</p>
<h2><a name="adding_a_perl_interpreter_to_your_c_program">Adding a Perl interpreter to your C program</a></h2>
<p>In a sense, perl (the C program) is a good example of embedding Perl
(the language), so I'll demonstrate embedding with <em>miniperlmain.c</em>,
included in the source distribution. Here's a bastardized, nonportable
version of <em>miniperlmain.c</em> containing the essentials of embedding:</p>
<pre>
<span class="comment">#include <EXTERN.h> /* from the Perl distribution */</span>
<span class="comment">#include <perl.h> /* from the Perl distribution */</span>
</pre>
<pre>
<span class="variable">static</span> <span class="variable">PerlInterpreter</span> <span class="variable">*my_perl</span><span class="operator">;</span> <span class="regex">/*** The Perl interpreter ***/</span>
</pre>
<pre>
<span class="keyword">int</span> <span class="variable">main</span><span class="operator">(</span><span class="keyword">int</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">argv</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">env</span><span class="operator">)</span>
<span class="operator">{</span>
<span class="variable">PERL_SYS_INIT3</span><span class="operator">(&</span><span class="variable">argc</span><span class="operator">,&</span><span class="variable">argv</span><span class="operator">,&</span><span class="variable">env</span><span class="operator">);</span>
<span class="variable">my_perl</span> <span class="operator">=</span> <span class="variable">perl_alloc</span><span class="operator">();</span>
<span class="variable">perl_construct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
<span class="variable">PL_exit_flags</span> <span class="operator">|=</span> <span class="variable">PERL_EXIT_DESTRUCT_END</span><span class="operator">;</span>
<span class="variable">perl_parse</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">,</span> <span class="keyword">NULL</span><span class="operator">,</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">argv</span><span class="operator">,</span> <span class="operator">(</span><span class="variable">char</span> <span class="operator">**)</span><span class="keyword">NULL</span><span class="operator">);</span>
<span class="variable">perl_run</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
<span class="variable">perl_destruct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
<span class="variable">perl_free</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
<span class="variable">PERL_SYS_TERM</span><span class="operator">();</span>
<span class="operator">}</span>
</pre>
<p>Notice that we don't use the <code>env</code> pointer. Normally handed to
<code>perl_parse</code> as its final argument, <code>env</code> here is replaced by
<code>NULL</code>, which means that the current environment will be used. The macros
<code>PERL_SYS_INIT3()</code> and <code>PERL_SYS_TERM()</code> provide system-specific tune up
of the C runtime environment necessary to run Perl interpreters; since
<code>PERL_SYS_INIT3()</code> may change <code>env</code>, it may be more appropriate to provide
<code>env</code> as an argument to perl_parse().</p>
<p>Now compile this program (I'll call it <em>interp.c</em>) into an executable:</p>
<pre>
% cc -o interp interp.c `perl -MExtUtils::Embed -e ccopts -e ldopts`</pre>
<p>After a successful compilation, you'll be able to use <em>interp</em> just
like perl itself:</p>
<pre>
<span class="operator">% </span><span class="variable">interp</span>
<span class="keyword">print</span> <span class="string">"Pretty Good Perl \n"</span><span class="operator">;</span>
<span class="keyword">print</span> <span class="string">"10890 - 9801 is "</span><span class="operator">,</span> <span class="number">10890</span> <span class="operator">-</span> <span class="number">9801</span><span class="operator">;</span>
<span class="operator"><</span><span class="variable">CTRL</span><span class="operator">-</span><span class="variable">D</span><span class="operator">></span>
<span class="variable">Pretty</span> <span class="variable">Good</span> <span class="variable">Perl</span>
<span class="number">10890</span> <span class="operator">-</span> <span class="number">9801</span> <span class="variable">is</span> <span class="number">1089</span>
</pre>
<p>or</p>
<pre>
% interp -e 'printf("%x", 3735928559)'
deadbeef</pre>
<p>You can also read and execute Perl statements from a file while in the
midst of your C program, by placing the filename in <em>argv[1]</em> before
calling <em>perl_run</em>.</p>
<p>
</p>
<h2><a name="calling_a_perl_subroutine_from_your_c_program">Calling a Perl subroutine from your C program</a></h2>
<p>To call individual Perl subroutines, you can use any of the <strong>call_*</strong>
functions documented in <a href="../../lib/Pod/perlcall.html">the perlcall manpage</a>.
In this example we'll use <code>call_argv</code>.</p>
<p>That's shown below, in a program I'll call <em>showtime.c</em>.</p>
<pre>
<span class="comment">#include <EXTERN.h></span>
<span class="comment">#include <perl.h></span>
</pre>
<pre>
<span class="variable">static</span> <span class="variable">PerlInterpreter</span> <span class="variable">*my_perl</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">int</span> <span class="variable">main</span><span class="operator">(</span><span class="keyword">int</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">argv</span><span class="operator">,</span> <span class="variable">char</span> <span class="operator">**</span><span class="variable">env</span><span class="operator">)</span>
<span class="operator">{</span>
<span class="variable">char</span> <span class="variable">*args</span><span class="operator">[]</span> <span class="operator">=</span> <span class="operator">{</span> <span class="string">NULL</span> <span class="operator">}</span><span class="operator">;</span>
<span class="variable">PERL_SYS_INIT3</span><span class="operator">(&</span><span class="variable">argc</span><span class="operator">,&</span><span class="variable">argv</span><span class="operator">,&</span><span class="variable">env</span><span class="operator">);</span>
<span class="variable">my_perl</span> <span class="operator">=</span> <span class="variable">perl_alloc</span><span class="operator">();</span>
<span class="variable">perl_construct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
</pre>
<pre>
<span class="variable">perl_parse</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">,</span> <span class="keyword">NULL</span><span class="operator">,</span> <span class="variable">argc</span><span class="operator">,</span> <span class="variable">argv</span><span class="operator">,</span> <span class="keyword">NULL</span><span class="operator">);</span>
<span class="variable">PL_exit_flags</span> <span class="operator">|=</span> <span class="variable">PERL_EXIT_DESTRUCT_END</span><span class="operator">;</span>
</pre>
<pre>
/*** skipping perl_run() ***/</pre>
<pre>
<span class="variable">call_argv</span><span class="operator">(</span><span class="string">"showtime"</span><span class="operator">,</span> <span class="variable">G_DISCARD</span> <span class="operator">|</span> <span class="variable">G_NOARGS</span><span class="operator">,</span> <span class="variable">args</span><span class="operator">);</span>
</pre>
<pre>
<span class="variable">perl_destruct</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
<span class="variable">perl_free</span><span class="operator">(</span><span class="variable">my_perl</span><span class="operator">);</span>
<span class="variable">PERL_SYS_TERM</span><span class="operator">();</span>
<span class="operator">}</span>
</pre>
<p>where <em>showtime</em> is a Perl subroutine that takes no arguments (that's the
<em>G_NOARGS</em>) and for which I'll ignore the return value (that's the
<em>G_DISCARD</em>). Those flags, and others, are discussed in <a href="../../lib/Pod/perlcall.html">the perlcall manpage</a>.</p>
<p>I'll define the <em>showtime</em> subroutine in a file called <em>showtime.pl</em>:</p>
<pre>
<span class="keyword">print</span> <span class="string">"I shan't be printed."</span><span class="operator">;</span>
</pre>
<pre>
<span class="keyword">sub</span><span class="variable"> showtime </span><span class="operator">{</span>
<span class="keyword">print</span> <span class="keyword">time</span><span class="operator">;</span>
<span class="operator">}</span>
</pre>
<p>Simple enough. Now compile and run:</p>
<pre>
% cc -o showtime showtime.c `perl -MExtUtils::Embed -e ccopts -e ldopts`</pre>
<pre>
% showtime showtime.pl
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?