<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
					xmlns:atom="http://www.w3.org/2005/Atom"
				  >
<channel>
<atom:link rel="self"  type="application/rss+xml"  href="http://rulinux.net/rss_from_sect_2_subsect_6_thread_34857"  />
<title>rulinux.net - Статьи - Development - Вызов функции, написанной на языке С из программы на языке perl</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Статьи - Development - Вызов функции, написанной на языке С из программы на языке perl</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>Вызов функции, написанной на языке С из программы на языке perl</title>
<link>https://rulinux.net/message.php?newsid=34857&amp;page=1#109455</link>
<guid>https://rulinux.net/message.php?newsid=34857&amp;page=1#109455</guid>
<pubDate>Thu, 04 Mar 2010 16:39:00 +0300</pubDate>
<description><![CDATA[<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> |  xs | <a
href="pixels.html">pixels</a> | <a
href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/c1.html">подсчет
объектов</a>
<b>Вызов функции, написанной на языке С из программы на языке perl</b>
<p>
Допустим, нужно что-то быстро вычислить, а скорости perl не хватает. Для этого в 
perl существует специальный интерфейс, позволяющий проводить вычисления на языке 
C. Соответствующие описания находятся в мауналах например perldoc perlxstut или 
perldoc perlguts. Ниже по тексту несколько примеров как передавать в модули
числа и последовательности байтов и получать на выходе различные структуры
данных.
<p>
<b>Скаляр</b>
<p>
Задача: Нужно вычислить сумму чисел до числа передаваемомго функции, т.е. если
функции передать число 5, то она должна вернуть число 1+2+3+4+5=15.

<p>
Командой h2xs -A -n Perebor создается пакет Perebor с одноименной директорией, 
в которой находится файл Perebor.xs, в котороый пишется нижеследующий код
(этот пример взят с <a
href="http://www.cip.physik.uni-muenchen.de/~tf/perl/lektion8.html">немецкого</a> сайта):
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>                <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>

<strong>int</strong>
<font color="#2040a0">sum_numbers</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">x</font><font color="4444FF">)</font>

        <font color="#2040a0">CODE</font><font color="4444FF">:</font>
         <font color="4444FF"><strong>{</strong></font>
           <strong>int</strong> <font color="#2040a0">i</font>, <font color="#2040a0">sum</font><font color="4444FF">;</font>
           <strong>for</strong><font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#FF0000">1</font>,<font color="#2040a0">sum</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font><font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">x</font><font color="4444FF">;</font><font color="#2040a0">i</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

             <font color="#2040a0">sum</font><font color="4444FF">+</font><font color="4444FF">=</font><font color="#2040a0">i</font><font color="4444FF">;</font>
           <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">RETVAL</font><font color="4444FF">=</font><font color="#2040a0">sum</font><font color="4444FF">;</font>
         <font color="4444FF"><strong>}</strong></font>

        <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
        <font color="#2040a0">RETVAL</font>
</pre>
Далее нужно сказать perl Makefile.PL, потом make. Вызов модуля  
при помощи программы
<pre>
<font color="#444444">#/usr/bin/perl -w

</font><strong>BEGIN</strong>
  <font color="4444FF"><strong>{</strong></font>

    <font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;
  <font color="4444FF"><strong>}</strong></font>

<strong>use</strong> Perebor;

<font color="#2040a0">$x</font>=Perebor::sum_numbers<font color="4444FF"><strong>(</strong></font>5<font color="4444FF"><strong>)</strong></font>;


<font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$x</font><font color="#77dd77">\n</font>&quot;</font>;

</pre>
<p>
<b>Массив</b>
<p>
Для того, чтобы функция возыращала массив или ссылку на массив, надо сделать
так:
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>                <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>

<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">l</font><font color="4444FF">)</font>
  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font><font color="4444FF">;</font>

  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="4444FF">=</font> <font color="#FF0000">1</font><font color="4444FF">;</font>
        <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>while</strong> <font color="4444FF">(</font><font color="#2040a0">n</font> <font color="4444FF">&lt;</font> <font color="#2040a0">l</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
          <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">n</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="#2040a0">n</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
        <font color="4444FF"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV_noinc</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font><font color="4444FF">)</font><font color="4444FF">;</font>

  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>
</pre>
Функция massiv вызывается как-то так: 
<pre>

<font color="#444444">#/usr/bin/perl -w

</font><strong>BEGIN</strong>
  <font color="4444FF"><strong>{</strong></font>

    <font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;
  <font color="4444FF"><strong>}</strong></font>
     
<strong>use</strong> Perebor;
     
<font color="#2040a0">$x</font>=Perebor::massiv<font color="4444FF"><strong>(</strong></font>11<font color="4444FF"><strong>)</strong></font>;
     

<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;
</pre>
В случае двух функций:

<pre>
<font color="#0000ff"><strong>#include <font color="#008000">"EXTERN.h"</font></strong></font>

<font color="#0000ff"><strong>#include <font color="#008000">"perl.h"</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">"XSUB.h"</font></strong></font>

<font color="#0000ff"><strong>#include <font color="#008000">"ppport.h"</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="#4444ff">=</font> <font color="#2040a0">Perebor</font>                <font color="#2040a0">PACKAGE</font> <font color="#4444ff">=</font> <font color="#2040a0">Perebor</font>


<font color="#2040a0">SV</font><font color="#4444ff">*</font>
<font color="#2040a0">massiv</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">l</font><font color="#4444ff">)</font>
  <font color="#2040a0">INIT</font><font color="#4444ff">:</font>
        <font color="#2040a0">AV</font><font color="#4444ff">*</font> <font color="#2040a0">array</font><font color="#4444ff">;</font>

  <font color="#2040a0">CODE</font><font color="#4444ff">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="#4444ff">=</font> <font color="#ff0000">1</font><font color="#4444ff">;</font>
        <font color="#2040a0">array</font> <font color="#4444ff">=</font> <font color="#2040a0">newAV</font><font color="#4444ff">(</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

        <strong>while</strong> <font color="#4444ff">(</font><font color="#2040a0">n</font> <font color="#4444ff">&lt;</font> <font color="#2040a0">l</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>
          <font color="#2040a0">av_push</font><font color="#4444ff">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="#4444ff">(</font><font color="#2040a0">n</font><font color="#4444ff">)</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

          <font color="#2040a0">n</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">;</font>
        <font color="#4444ff"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="#4444ff">=</font> <font color="#2040a0">newRV_noinc</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">SV</font><font color="#4444ff">*</font><font color="#4444ff">)</font><font color="#2040a0">array</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">OUTPUT</font><font color="#4444ff">:</font>
      <font color="#2040a0">RETVAL</font>

<font color="#2040a0">SV</font><font color="#4444ff">*</font>
<font color="#2040a0">massiv_square</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">l</font><font color="#4444ff">)</font>

  <font color="#2040a0">INIT</font><font color="#4444ff">:</font>
        <font color="#2040a0">AV</font><font color="#4444ff">*</font> <font color="#2040a0">array</font><font color="#4444ff">;</font>
  <font color="#2040a0">CODE</font><font color="#4444ff">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="#4444ff">=</font> <font color="#ff0000">1</font><font color="#4444ff">;</font>

        <font color="#2040a0">array</font> <font color="#4444ff">=</font> <font color="#2040a0">newAV</font><font color="#4444ff">(</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
        <strong>while</strong> <font color="#4444ff">(</font><font color="#2040a0">n</font> <font color="#4444ff">&lt;</font> <font color="#2040a0">l</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

          <font color="#2040a0">av_push</font><font color="#4444ff">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="#4444ff">(</font><font color="#2040a0">n</font><font color="#4444ff">*</font><font color="#2040a0">n</font><font color="#4444ff">)</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
          <font color="#2040a0">n</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">;</font>

        <font color="#4444ff"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="#4444ff">=</font> <font color="#2040a0">newRV_noinc</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">SV</font><font color="#4444ff">*</font><font color="#4444ff">)</font><font color="#2040a0">array</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">OUTPUT</font><font color="#4444ff">:</font>
      <font color="#2040a0">RETVAL</font>
</pre>
Perl код такой:
<pre>
<font color="#444444">#/usr/bin/perl -w
</font><strong>BEGIN</strong>
  <font color="4444FF"><strong>{</strong></font>

    <font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;
  <font color="4444FF"><strong>}</strong></font>

<strong>use</strong> Perebor;

<font color="#2040a0">$x</font>=Perebor::massiv<font color="4444FF"><strong>(</strong></font>11<font color="4444FF"><strong>)</strong></font>;


<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

<font color="#2040a0">$x</font>=Perebor::massiv_square<font color="4444FF"><strong>(</strong></font>11<font color="4444FF"><strong>)</strong></font>;


<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

</pre>

<p>

Если есть необходимость передать в программу строку чисел, упакованных
функцией pack C*, 123 (т.е. числа в 16-тиричном виде), то возникает
проблема следующего толка: при обработке
символа '\x00' (ноль в 16-тиричном виде), сишнная функция завершит работу,
т.к. ноль это конец записи. Для того, чтобы избежать этой проблемы,
нужно помимо строки unsigned char передать её длинну, вычисленную функцией
perl length:

<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Perebor</font>

<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">number</font>, <strong>int</strong> <font color="#2040a0">l</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font><font color="4444FF">;</font>
        <strong>int</strong> <font color="#2040a0">sum</font><font color="4444FF">;</font>

        <strong>double</strong> <font color="#2040a0">y</font><font color="4444FF">;</font>
  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
        <strong>int</strong> <font color="#2040a0">n</font> <font color="4444FF">=</font> <font color="#FF0000">0</font><font color="4444FF">;</font>

        <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <strong>while</strong> <font color="4444FF">(</font><font color="#2040a0">n</font> <font color="4444FF">&lt;</font> <font color="#2040a0">l</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

          <font color="#2040a0">sum</font><font color="4444FF">=</font><font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">n</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">]</font><font color="4444FF">;</font>
          <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#2040a0">sum</font><font color="4444FF">*</font><font color="#2040a0">sum</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV_noinc</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font><font color="4444FF">)</font><font color="4444FF">;</font>

  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>
</pre>
В случае, если не написать unsigned char а просто char, то значения
передаваемой переменной будут изменяться в диапазоне от -128 до 128, что
испортит картину, написанную маслом. 

<p>
Perl код, вызывающий функцию getnum, выглядит так:
<pre>
<font color="#444444">#/usr/bin/perl -w
</font><strong>BEGIN</strong>
<font color="4444FF"><strong>{</strong></font>

<font color="a52a2a"><strong>push</strong></font> <font color="#2040a0">@INC</font>, <font color="#008000">&quot;./blib/arch&quot;</font>, <font color="#008000">&quot;./blib/lib&quot;</font>;

<font color="4444FF"><strong>}</strong></font>

<strong>use</strong> Perebor;

<font color="#2040a0">$txt</font>=<font color="#008000">&quot;<font color="#77dd77">\x</font>00<font color="#77dd77">\x</font>01<font color="#77dd77">\x</font>02<font color="#77dd77">\x</font>03<font color="#77dd77">\x</font>04<font color="#77dd77">\x</font>dd<font color="#77dd77">\x</font>cd<font color="#77dd77">\x</font>fe&quot;</font>;

<font color="#2040a0">$x</font>=Perebor::getnum<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt</font>,<font color="a52a2a"><strong>length</strong></font> <font color="#2040a0">$txt</font><font color="4444FF"><strong>)</strong></font>;
<font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@{$x}</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;


</pre>
<b>Хэши</b>
<p>
Предположим, теперь нужно построить и вернуть в си-программу хеш
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>

<font color="#2040a0">SV</font> <font color="4444FF">*</font>

<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
  <font color="#2040a0">CODE</font><font color="4444FF">:</font>

        <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;aaa&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSViv</font><font color="4444FF">(</font><font color="#2040a0">k</font><font color="4444FF">)</font>, <font color="#FF0000">1</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;bbb&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font><font color="4444FF">(</font><font color="#008000">&quot;xxx&quot;</font>,<font color="#FF0000">0</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV</font><font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">hash</font> <font color="4444FF">)</font><font color="4444FF">;</font> <font color="#444444">/* bepmsr| qq{kjs m u}x */</font>

  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
  <font color="#2040a0">RETVAL</font>
</pre>
возвращает ссылку на хеш, функцию Hval::getnum можно вызвать так:
<pre>

<font color="#444444">#!/usr/bin/perl -w

</font><strong>use</strong> strict;
<strong>use</strong> warnings;

<strong>use</strong> ExtUtils::testlib;
<strong>use</strong> Hval;
<strong>use</strong> Data::Dumper;

<strong>my</strong> <font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font>10<font color="4444FF"><strong>)</strong></font>;

<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <fontcolor="4444FF"><strong>{</strong></font>
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; <font color="#2040a0">$hash_ref</font>-&gt;{<font color="#2040a0">$key</font>}<font color="#77dd77">\n</font>&quot;</font>;

<font color="4444FF"><strong>}</strong></font>

<font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font>2<font color="4444FF"><strong>)</strong></font>;
<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>

  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; <font color="#2040a0">$hash_ref</font>-&gt;{<font color="#2040a0">$key</font>}<font color="#77dd77">\n</font>&quot;</font>;
<font color="4444FF"><strong>}</strong></font>

<font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font>7<font color="4444FF"><strong>)</strong></font>;
<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>

  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; <font color="#2040a0">$hash_ref</font>-&gt;{<font color="#2040a0">$key</font>}<font color="#77dd77">\n</font>&quot;</font>;
<font color="4444FF"><strong>}</strong></font>

</pre>
вывод:
<pre>
File rr.pl not changed so no update needed.
[vilfred@mobile100 Hval]$ perl rr.pl
bbb => xxx
aaa => 10
bbb => xxx
aaa => 2
bbb => xxx
aaa => 7
[vilfred@mobile100 Hval]$ 
</pre>
Передача и возврат данных в виде "\x00\ff..." etc... через хэш:
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>

<font color="#2040a0">SV</font> <font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">data</font>,<strong>int</strong> <font color="#2040a0">l</font>,<strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

   <font color="#2040a0">INIT</font><font color="4444FF">:</font>
   <font color="#2040a0">CODE</font><font color="4444FF">:</font>
      
     <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

     <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;unsigned_char&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">data</font>, <font color="#2040a0">l</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

                
   <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV</font><font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">hash</font> <font color="4444FF">)</font><font color="4444FF">;</font> 
                   
   <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>

   <font color="#2040a0">RETVAL</font>
</pre>
Перл-код соответственно такой:
<pre>
<font color="#444444">#!/usr/bin/perl -w

</font><strong>use</strong> strict;
<strong>use</strong> warnings;
<strong>use</strong> ExtUtils::testlib;

<strong>use</strong> Hval;

<strong>use</strong> Data::Dumper;

<strong>my</strong> <font color="#2040a0">$txt</font>=<font color="a52a2a"><strong>pack</strong></font> <font color="#008000">&quot;C&quot;</font>,255;

<strong>my</strong> <font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt</font>,<font color="a52a2a"><strong>length</strong></font> <font color="#2040a0">$txt</font>,10<font color="4444FF"><strong>)</strong></font>;


<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>
<font color="#444444">#  print &quot;$key =&gt; $hash_ref-&gt;{$key}\n\n&quot;;
  </font><font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; &quot;</font>.<font color="a52a2a"><strong>unpack</strong></font> <font color="#008000">&quot;C&quot;</font>,<font color="#2040a0">$hash_ref</font>-&gt;<font color="4444FF"><strong>{</strong></font><font color="#2040a0">$key</font><font color="4444FF"><strong>}</strong></font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

<font color="4444FF"><strong>}</strong></font>
</pre>
и работает вот так:
<pre>
[vilfred@mobile100 Hval]$ perl rr.pl
uns => 255
[vilfred@mobile100 Hval]$

</pre>
Создание хеша с именоваными ключами и значениями в виде массива и строки в
виде \x00\xff...
<pre>
<font color="0000ff"><strong>#include <font color="#008000">&quot;EXTERN.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;perl.h&quot;</font></strong></font>
<font color="0000ff"><strong>#include <font color="#008000">&quot;XSUB.h&quot;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>

<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>            <font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Hval</font>

<font color="#2040a0">SV</font> <font color="4444FF">*</font>
<font color="#2040a0">getnum</font><font color="4444FF">(</font><strong>char</strong> <font color="4444FF">*</font><font color="#2040a0">data</font>,<strong>int</strong> <font color="#2040a0">l</font>,<strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>

  <font color="#2040a0">CODE</font><font color="4444FF">:</font>
    
        <font color="#2040a0">HV</font><font color="4444FF">*</font> <font color="#2040a0">hash</font> <font color="4444FF">=</font> <font color="#2040a0">newHV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">AV</font><font color="4444FF">*</font> <font color="#2040a0">array</font> <font color="4444FF">=</font> <font color="#2040a0">newAV</font><font color="4444FF">(</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">av_push</font><font color="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#FF0000">34</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font> 
        <font color="#2040a0">av_push</font><fontcolor="4444FF">(</font><font color="#2040a0">array</font>, <font color="#2040a0">newSVnv</font><font color="4444FF">(</font><font color="#FF0000">77</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font> 
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;unsigned_char&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">data</font>, <font color="#2040a0">l</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">data</font><font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">)</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;array&quot;</font>,<font color="#FF0000">3</font>,<font color="4444FF">(</font><font color="#2040a0">SV</font><font color="4444FF">*</font><font color="4444FF">)</font><font color="#2040a0">array</font>, <font color="#FF0000">0</font><font color="4444FF">)</font><font color="4444FF">;</font>

      <font color="#2040a0">RETVAL</font> <font color="4444FF">=</font> <font color="#2040a0">newRV</font><font color="4444FF">(</font> <font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="4444FF">)</font> <fontcolor="#2040a0">hash</font> <font color="4444FF">)</font><font color="4444FF">;</font> 
    
  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>

      <font color="#2040a0">RETVAL</font>


</pre>
Возвращается хеш с двумя элементами: массивом и строкой unsigned char в виде
'\x00\xff...' 
<pre>
<font color="#444444">#!/usr/bin/perl -w

</font><strong>use</strong> strict;
<strong>use</strong> warnings;
<strong>use</strong> ExtUtils::testlib;


<strong>use</strong> Hval;
<strong>use</strong> Data::Dumper;

<strong>my</strong> <font color="#2040a0">$txt</font>=<font color="a52a2a"><strong>pack</strong></font> <font color="#008000">&quot;C&quot;</font>,255;
<strong>my</strong> <font color="#2040a0">$hash_ref</font> = Hval::getnum<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt</font>,<font color="a52a2a"><strong>length</strong></font> <font color="#2040a0">$txt</font>,10<font color="4444FF"><strong>)</strong></font>;


<strong>foreach</strong> <strong>my</strong> <font color="#2040a0">$key</font> <font color="4444FF"><strong>(</strong></font><font color="a52a2a"><strong>keys</strong></font> <font color="#2040a0">%$hash_ref</font><font color="4444FF"><strong>)</strong></font> <font color="4444FF"><strong>{</strong></font>
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; &quot;</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; | &quot;</font>=&gt; <font color="#2040a0">@{$hash_ref-&gt;{$key}</font><font color="4444FF"><strong>}</strong></font> <strong>if</strong> <font color="#2040a0">$key</font> <strong>ne</strong> <font color="#008000">'uns'</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font><font color="#77dd77">\n</font>&quot;</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#2040a0">$key</font> =&gt; &quot;</font>.<font color="a52a2a"><strong>unpack</strong></font> <font color="#008000">&quot;C&quot;</font>,<font color="#2040a0">$hash_ref</font>-&gt;<font color="4444FF"><strong>{</strong></font><font color="#2040a0">$key</font><font color="4444FF"><strong>}</strong></font> <strong>if</strong> <font color="#2040a0">$key</font> <strong>eq</strong> <font color="#008000">'uns'</font>;
  <font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;

<font color="4444FF"><strong>}</strong></font>
     
</pre>

Работа с <a href="http://genphys.phys.msu.ru/~dmitriyk/perl/lpt.html">параллельным
портом</a> при помощи xs
<p>
<b>Обработка изображений</b>
<p>
В <a
href="http://gtk2-perl.sourceforge.net/">gtk2-perl</a> есть функция,
позволяющая получать яркость пикселей в виде строки '\xff\x00...'. Т.к.
зачастую при обработке изображений важна скорость работы программы, то по
скорости get_pixels(), в принципе, может использоваться для обработки
одиночных рисунков:

<pre>
<font color="#444444">#!/usr/bin/perl

</font><strong>use</strong> strict;
<strong>use</strong> warnings;
<strong>use</strong> Glib <font
color="a52a2a"><strong>qw</strong></font><font color="4444FF"><strong>(</strong></font>FALSE TRUE<font color="4444FF"><strong>)</strong></font>;

<strong>use</strong> Gtk2 -init;

<strong>use</strong> ExtUtils::testlib;
<strong>use</strong> HalfWork;

<strong>my</strong><font color="4444FF"><strong>(</strong></font><font color="#2040a0">@criteria</font>,<font color="#2040a0">@a</font>,<font color="#2040a0">@res</font>,<font color="#2040a0">$pix</font>,<font color="#2040a0">$button</font>,<font color="#2040a0">@m</font>,<font color="#2040a0">$img</font>,<font color="#2040a0">$pixbuf</font>,<font color="#2040a0">$pixels</font>,<font color="#2040a0">$w</font>,<font color="#2040a0">$h</font>,<font color="#2040a0">$c</font><font color="4444FF"><strong>)</strong></font>;



<strong>sub<font color="ff0000"> render_image</font>{</strong>
  <strong>my</strong> <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt1</font>,<font color="#2040a0">$min</font>, <font color="#2040a0">$max</font><font color="4444FF"><strong>)</strong></font>; <font color="#2040a0">$min</font>=10; <font color="#2040a0">$max</font>=440;
  <font color="#2040a0">$img</font>=<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$img</font>=<font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$pixbuf</font> = Gtk2::Gdk::Pixbuf-&gt;new_from_file <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$img</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$pixels</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_pixels<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$h</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_height; <font color="#2040a0">$w</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_width;

<font color="4444FF"><strong>}</strong></font>
            
<strong>while</strong> <font color="4444FF"><strong>(</strong></font>&lt;<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>/*.*&gt;<font color="4444FF"><strong>)</strong></font><font color="4444FF"><strong>{</strong></font>
  <font color="a52a2a"><strong>print</strong></font> <font color="#2040a0">$c</font>++,<font color="#008000">&quot; &quot;</font>;
  &amp;render_image<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$_</font><font color="4444FF"><strong>)</strong></font> <strong>if</strong><font color="b000d0"> m!\.jpg$!</font>;

<font color="4444FF"><strong>}</strong></font>
</pre>
Скорость работы соответственно: 
<pre>
[vilfred@mobile100 HalfWork]$ time perl fast.pl ../datchik/files/
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
79 80 81 82 83 84 85
real    0m2.230s
user    0m1.893s
sys     0m0.320s
[vilfred@mobile100 HalfWork]$ perl -e 'print 85/2.2,"\n"'
38.6363636363636
[vilfred@mobile100 HalfWork]$
</pre>
38 кадров 640x480 в секудну.
<p>

Чтобы работать не с пикселями а с картинкой, т.е. сразу видеть результаты
работы алгоритма, пишется, например, такой код:
<pre>
<font color="#444444">#!/usr/bin/perl

</font><strong>use</strong> strict;
<strong>use</strong> warnings;

<strong>use</strong> Glib <font color="a52a2a"><strong>qw</strong></font><font color="4444FF"><strong>(</strong></font>FALSE TRUE<font color="4444FF"><strong>)</strong></font>;

<strong>use</strong> Gtk2 -init;
<strong>use</strong> ExtUtils::testlib;
<strong>use</strong> HalfWork;


<strong>my</strong><font color="4444FF"><strong>(</strong></font><font color="#2040a0">@criteria</font>,<font color="#2040a0">@a</font>,<font color="#2040a0">@res</font>,<font color="#2040a0">$pix</font>,<font color="#2040a0">$button</font>,<font color="#2040a0">@m</font>,<font color="#2040a0">$img</font>,<font color="#2040a0">$pixbuf</font>,<font color="#2040a0">$pixels</font>,<font color="#2040a0">$w</font>,<font color="#2040a0">$h</font>,<font color="#2040a0">$c</font><font color="4444FF"><strong>)</strong></font>;


<strong>my</strong> <font color="#2040a0">$window</font>  = Gtk2::Window-&gt;<strong>new</strong> <font color="4444FF"><strong>(</strong></font> <font color="#008000">&quot;toplevel&quot;</font> <font color="4444FF"><strong>)</strong></font>;
<strong>my</strong> <font color="#2040a0">$hbox</font>    = Gtk2::HBox-&gt;<strong>new</strong> <font color="4444FF"><strong>(</strong></font>1,1<font color="4444FF"><strong>)</strong></font>;

<strong>my</strong> <font color="#2040a0">$vbox</font>    = Gtk2::VBox-&gt;<strong>new</strong> <font color="4444FF"><strong>(</strong></font>0,1<font color="4444FF"><strong>)</strong></font>;
<strong>my</strong> <font color="#2040a0">$image</font>   = Gtk2::Image-&gt;<strong>new</strong>;

<strong>my</strong> <font color="#2040a0">$e</font>;

&amp;images<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;

<strong>sub<font color="ff0000"> render_image</font>{</strong>
  <strong>my</strong> <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$txt1</font>,<font color="#2040a0">$min</font>, <font color="#2040a0">$max</font><font color="4444FF"><strong>)</strong></font>; <font color="#2040a0">$min</font>=10; <font color="#2040a0">$max</font>=440;


<font color="#444444">#  die &quot;Usage: $0 imagefile\n&quot; unless @ARGV;
  </font><font color="#2040a0">$img</font>=<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$img</font>=<font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font> <strong>if</strong> <font color="#2040a0">$_</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>;
  <font color="#2040a0">$pixbuf</font> = Gtk2::Gdk::Pixbuf-&gt;new_from_file <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$img</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$pixels</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_pixels<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$h</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_height; <font color="#2040a0">$w</font> = <font color="#2040a0">$pixbuf</font>-&gt;get_width;
  <strong>my</strong> <font color="#2040a0">$criteria</font>;

  <font color="#2040a0">$pixbuf</font> = Gtk2::Gdk::Pixbuf-&gt;new_from_data
                        <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$pixels</font>,  <font color="#444444"># packed image data in a scalar
                           </font><font color="#008000">'rgb'</font>,  <font color="#444444"># only 24- or 32-bit RGB are supported
                               </font>0,  <font color="#444444"># no alpha, data is 24-bit
                               </font>8,  <font color="#444444"># only 8 bits per sample are supported
                              </font><font color="#2040a0">$w</font>,  <font color="#444444"># in pixels
                              </font><font color="#2040a0">$h</font>,  <font color="#444444"># in pixels
                            </font><font color="#2040a0">$w</font>*3<font color="4444FF"><strong>)</strong></font>; <font color="#444444"># number of *bytes* in each row
                            
  </font><font color="#2040a0">$image</font>-&gt;set_from_pixbuf <font color="4444FF"><strong>(</strong></font><font color="#2040a0">$pixbuf</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$window</font>-&gt;set_title<font color="4444FF"><strong>(</strong></font><font color="#008000">&quot;imaging <font color="#2040a0">$img</font>&quot;</font><font color="4444FF"><strong>)</strong></font>;
  <font color="#2040a0">$img</font>=<font color="#008000">''</font>; <font color="#2040a0">$#</font>res=-1;


<font color="4444FF"><strong>}</strong></font>

<font color="#2040a0">$window</font>-&gt;add<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$hbox</font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$hbox</font>-&gt;add<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$vbox</font><font color="4444FF"><strong>)</strong></font>;

<font color="#2040a0">$vbox</font>-&gt;add<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$image</font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$button</font> = Gtk2::Button-&gt;<strong>new</strong><font color="4444FF"><strong>(</strong></font><font color="#008000">&quot;Repaint...&quot;</font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$button</font>-&gt;signal_connect<font color="4444FF"><strong>(</strong></font><font color="#008000">&quot;clicked&quot;</font>, \&amp;signal<font color="4444FF"><strong>)</strong></font>;

<font color="#2040a0">$vbox</font>-&gt;pack_start<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$button</font>, 1, 1, 5<font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$window</font>-&gt;signal_connect<font color="4444FF"><strong>(</strong></font> <font color="#008000">&quot;destroy&quot;</font> , sub <font color="4444FF"><strong>{</strong></font> Gtk2-&gt;main_quit ; <font color="4444FF"><strong>}</strong></font> <font color="4444FF"><strong>)</strong></font> ;

<font color="#2040a0">$window</font>-&gt;signal_connect <font color="4444FF"><strong>(</strong></font>delete_event =&gt; sub <font color="4444FF"><strong>{</strong></font>Gtk2-&gt;main_quit;<font color="4444FF"><strong>}</strong></font><font color="4444FF"><strong>)</strong></font>;
<font color="#2040a0">$window</font>-&gt;show_all<font color="4444FF"><strong>(</strong></font><font color="4444FF"><strong>)</strong></font>;


<strong>eval</strong> <font color="4444FF"><strong>{</strong></font>
Gtk2-&gt;main; <font color="4444FF"><strong>}</strong></font>;

<strong>my</strong> <font color="#2040a0">$cry</font>;
<font color="a52a2a"><strong>open</strong></font> F,<font color="#008000">&quot;&gt;<font color="#2040a0">$ARGV</font>[0]/criteria.txt&quot;</font> <strong>or</strong> <strong>die</strong> <font color="#008000">&quot;cant open: <font color="#2040a0">$!</font>&quot;</font>;


<strong>foreach</strong> <font color="4444FF"><strong>(</strong></font><font color="#2040a0">@criteria</font><font color="4444FF"><strong>)</strong></font><font color="4444FF"><strong>{</strong></font> <font color="#2040a0">$cry</font>+=<font color="#2040a0">$_</font> <font color="4444FF"><strong>}</strong></font>
<font color="a52a2a"><strong>print</strong></font> F <font color="#2040a0">$cry</font>/<font color="#2040a0">$#</font>criteria,<font color="#008000">&quot; | &quot;</font>, <font color="a52a2a"><strong>print</strong></font> <font color="a52a2a"><strong>join</strong></font> <font color="#008000">&quot; &quot;</font> =&gt; <font color="#2040a0">@criteria</font>,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;


<font color="a52a2a"><strong>close</strong></font> F;
<font color="a52a2a"><strong>print</strong></font> <font color="#008000">&quot;<font color="#77dd77">\n</font>уТЕДОЕЕ ЪОБЮЕОЙЕ ЮЙУМБ НБЛУЙНХНПЧ: &quot;</font>,<font color="#2040a0">$cry</font>/<font color="#2040a0">$#</font>criteria,<font color="#008000">&quot;<font color="#77dd77">\n</font>&quot;</font>;
<strong>exit</strong> 0;


<strong>sub<font color="ff0000"> signal</font> {</strong>
  &amp;render_image<font color="4444FF"><strong>(</strong></font><font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$#</font><font color="#2040a0">m</font><strong><font color="4444FF">]</font></strong>) <font color="b000d0">if </font><font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$#</font><font color="b000d0">m</font><strong><font color="4444FF">]</font></strong><font color="b000d0"> and -f </font><font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$#</font><font color="b000d0">m</font><strong><font color="4444FF">]</font></strong></font>;
  <font color="a52a2a"><strong>pop</strong></font> <font color="#2040a0">@m</font>;
  Glib::Timeout-&gt;add <font color="4444FF"><strong>(</strong></font>100,
  sub <font color="4444FF"><strong>{</strong></font> <font color="#2040a0">$button</font>-&gt;clicked; 0<font color="4444FF"><strong>}</strong></font><font color="4444FF"><strong>)</strong></font>;

<font color="4444FF"><strong>}</strong></font>

<strong>sub<font color="ff0000"> images</font>{</strong>
  <strong>while</strong> <font color="4444FF"><strong>(</strong></font>&lt;<font color="#2040a0">$ARGV</font><font color="4444FF"><strong>[</strong></font>0<font color="4444FF"><strong>]</strong></font>/*.*&gt;<font color="4444FF"><strong>)</strong></font><font color="4444FF"><strong>{</strong></font>

    <font color="#2040a0">$m</font><font color="4444FF"><strong>[</strong></font><font color="#2040a0">$c</font>++<font color="4444FF"><strong>]</strong></font>=<font color="#2040a0">$_</font> <strong>if</strong><font color="b000d0"> m!\.jpg$!</font>;
  <font color="4444FF"><strong>}</strong></font>
  <font color="a52a2a"><strong>reverse</strong></font> <font color="#2040a0">@m</font>;


<font color="4444FF"><strong>}</strong></font>
</pre>
и результат его работы:
<pre>
[vilfred@mobile100 HalfWork]$ time perl wheather.pl ../datchik/files/

real    0m12.635s
user    0m2.565s
sys     0m0.453s
[vilfred@mobile100 HalfWork]$ perl -e 'print 85/11,"\n"'
7.72727272727273
[vilfred@mobile100 HalfWork]$
</pre>
т.е. около 8 кадров в секунду. Скриншот программы:
<p>
<img src="proga.jpg">
<p>
<!--
<b>Пример использования xs для обработки изображений</b>
<p>
Нужно усреднить картинку по скользящему среднему и посмотреть что из этого
выйдет, т.е. работать не с массивами чисел, а тут-же проглядывать результат.
<p>
Для этого пишется следующий xs,  
-->

<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | xs | <a href="pixels.html">next</a>]]></description>
</item>
</channel>
</rss>