<?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"  />
<title>rulinux.net - Статьи - Development</title>
<link>http://rulinux.net/</link>
<description><![CDATA[Портал о GNU/Linux и не только]]></description>
<image><title>rulinux.net - Статьи - Development</title>
<link>http://rulinux.net/</link>
<url>http://rulinux.net/rss_icon.png</url>
</image>
<item>
<title>как из perl сделать rtf-документ с картинками и таблицами</title>
<link>https://rulinux.net/message.php?newsid=42980&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=42980&amp;page=1</guid>
<pubDate>Tue, 05 Sep 2017 12:22:32 +0300</pubDate>
<description><![CDATA[<p>делается это таким скриптом и его откроет и отобразит корректно любая версия Microsoft Word . Картинка вставляется в само тело rtf-файла.<br><br><fieldset><legend>perl</legend><div class="highlight perl"><br />
<br />
<span class="co1">#!/usr/bin/perl -w</span><br />
<br />
<span class="kw2">use</span> RTF<span class="sy0">::</span><span class="me2">Writer</span><span class="sy0">;</span><br />
<span class="kw2">use</span> utf8<span class="sy0">;</span><br />
<span class="kw2">use</span> strict<span class="sy0">;</span><br />
<br />
<span class="kw1">my</span> <span class="re0">$rtf</span> <span class="sy0">=</span> RTF<span class="sy0">::</span><span class="me2">Writer</span><span class="sy0">-&gt;</span><span class="me1">new_to_file</span><span class="br0">&#40;</span><span class="st0">&quot;/home/vilfred/test.rtf&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">prolog</span><span class="br0">&#40;</span> <span class="st_h">'title'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;rrr&quot;</span><span class="sy0">,</span> <span class="st_h">'author'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;eee&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
<span class="kw1">for</span><span class="br0">&#40;</span>1 <span class="sy0">..</span> 3<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
<br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">paragraph</span><span class="br0">&#40;</span>\<span class="st_h">'\fi450\fs25\b\i'</span><span class="sy0">,</span><span class="st0">&quot;раздватри<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">paragraph</span><span class="br0">&#40;</span>\<span class="st_h">'\fs25\fi450\sl370\slmult1\sb190\sa270'</span><span class="sy0">,</span><span class="st0">&quot;развдатри<span class="es0">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="kw1">my</span> <span class="re0">$tab</span> <span class="sy0">=</span> RTF<span class="sy0">::</span><span class="me2">Writer</span><span class="sy0">::</span><span class="me2">TableRowDecl</span><span class="sy0">-&gt;</span><span class="me1">new</span><span class="br0">&#40;</span> <span class="st_h">'widths'</span> <span class="sy0">=&gt;</span> <span class="br0">&#91;</span> 800<span class="sy0">,</span> 1200 <span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">row</span><span class="br0">&#40;</span> <span class="re0">$tab</span><span class="sy0">,</span> <span class="st_h">'один'</span><span class="sy0">,</span> <span class="st_h">'два xxxxxxx'</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">row</span><span class="br0">&#40;</span> <span class="re0">$tab</span><span class="sy0">,</span> <span class="st_h">'три'</span><span class="sy0">,</span> <span class="st_h">'четыыре yyyyyyyyy'</span> <span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">paragraph</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; \<span class="st_h">'\qc'</span><span class="sy0">,</span> &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">image</span><span class="br0">&#40;</span> <span class="st_h">'filename'</span> <span class="sy0">=&gt;</span> <span class="st0">&quot;/home/vilfred/1.png&quot;</span><span class="sy0">,</span> scalex <span class="sy0">=&gt;</span> <span class="nu0">10</span><span class="sy0">,</span> scaley <span class="sy0">=&gt;</span> <span class="nu0">10</span> <span class="br0">&#41;</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; <span class="co1"># scale - масштаб в процентах от исходного размера картинки</span><br />
&nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="re0">$rtf</span><span class="sy0">-&gt;</span><span class="me1">close</span><span class="sy0">;</span><br />
<br />
<br />
<br />
&nbsp;</div></fieldset></p>]]></description>
</item>
<item>
<title>Локализация $@ в DESTROY</title>
<link>https://rulinux.net/message.php?newsid=34858&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34858&amp;page=1</guid>
<pubDate>Wed, 01 Jun 2011 18:31:00 +0400</pubDate>
<description><![CDATA[<p>Недавно обнаружил, что локализовывать переменную $@ в DESTROY методе бывает очень полезно. Даже, похоже, сабж можно поместить в мануал как best practice (или я невнимательно читал мануалы, и там такое уже есть?). Без лишних слов:</p><p><fieldset><legend>perl</legend><code><br />
<br />
<span style="color: #666666; font-style: italic;">#!perl -w</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> warnings<span style="color: #339933;">;</span><br />
&nbsp;<br />
<a href="http://perldoc.perl.org/functions/package.html"><span style="color: #000066;">package</span></a> Animal<span style="color: #339933;">;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">sub</span> <span style="color: #000000; font-weight: bold;">new</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$class</span> <span style="color: #339933;">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/return.html"><span style="color: #000066;">return</span></a> <a href="http://perldoc.perl.org/functions/bless.html"><span style="color: #000066;">bless</span></a> <span style="color: #009900;">&#123;</span> <span style="color: #ff0000;">'a'</span> <span style="color: #339933;">=&gt;</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">,</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <a href="http://perldoc.perl.org/functions/ref.html"><span style="color: #000066;">ref</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$class</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span> <span style="color: #0000ff;">$class</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">sub</span> moo<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$self</span> <span style="color: #339933;">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;$self-&gt;{'a'} says: moo<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
<span style="color: #000000; font-weight: bold;">sub</span> DESTROY<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$self</span> <span style="color: #339933;">=</span> <a href="http://perldoc.perl.org/functions/shift.html"><span style="color: #000066;">shift</span></a><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/eval.html"><span style="color: #000066;">eval</span></a> <span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">$self</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">moo</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
&nbsp;<br />
<span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
&nbsp;<br />
<a href="http://perldoc.perl.org/functions/package.html"><span style="color: #000066;">package</span></a> main<span style="color: #339933;">;</span><br />
&nbsp;<br />
<a href="http://perldoc.perl.org/functions/eval.html"><span style="color: #000066;">eval</span></a> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$a</span> <span style="color: #339933;">=</span> Animal<span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'Cow'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">$a</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">bark</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp;<br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$@</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;Cow cannot bark<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;Cow can bark<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
&nbsp;</code></fieldset></p><p>Программа выведет: Cow says: moo Cow can bark</p><p>Ну, наверное, вам уже стало понятно почему корова может гавкать?! Тут всё довольно просто и прозрачно. А вот диагностировать подобную проблему в сложной системе с кучей используемых модулей и фреймворков довольно сложно. На это можно убить даже не несколько часов, а несколько дней. Так что, рекомендую локализовывать $@ в DESTROY методе ваших классов.</p><p>По этой же причине значению, которое вернул eval, вообще нельзя доверять (ты же не контролируешь код всех модулей, которые используешь), и стоит использовать Try::Tiny или что-то подобное.</p><p>(с) этот текст - найденная на просторах интернета копипаста</p>]]></description>
</item>
<item>
<title>Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в виждете gtk2-perl</title>
<link>https://rulinux.net/message.php?newsid=34867&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34867&amp;page=1</guid>
<pubDate>Thu, 04 Mar 2010 16:43:00 +0300</pubDate>
<description><![CDATA[<p>
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | <a href=xs.html>Предыдущая</a> | Извлечение пикселей |
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/c1.html">подсчет объектов</a>
| | <a href="haar.html">wavelet</a>

<p>
Извлечение пикселей из картинки при помощи ImageMagick и показ картинки в
виждете gtk2-perl.<p align=justify>
Gtk2-perl позволяет получить доступ к пикселям при помощи функции
get_pixels, которая возвращает 16-ти битную строку пикселей длины w*h*3 для
RGB изображения.
Единственное неудобство в том, что функции для работы с изображениями Gtk2-perl понимают
несколько форматов картинок, а ImageMagick позволяет работать с более чем
90 форматами изображений. Функция Gtk2::Gdk::Pixbuf->new_from_data может из
строки в 16-тиричном формате выстраивать картинку. Значит для этого надо
открыть картинку, прочитать пикселы и затем сформировать и
передать в perl соответствующую строку при помощи библиотеки ImageMagick. 
<p align=justify>
Для начала необходимо написать программу на c, после чего уже писать
соответствующий XS-модуль. Программа выглядит как-то так:
<pre>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;stdlib.h&gt;</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;stdio.h&gt;</font></strong></font>
<font color="#0000ff"><strong>#include <font color="#008000">&lt;string.h&gt;</font></strong></font>
// подключить API ImageMagick

<font color="#0000ff"><strong>#include <font color="#008000">&lt;magick/api.h&gt;</font></strong></font>

<strong>int</strong> <font color="#2040a0">main</font><font color="#4444ff">(</font><strong>int</strong> <font color="#2040a0">argc</font>,<strong>char</strong> <font color="#4444ff">*</font><font color="#4444ff">*</font><font color="#2040a0">argv</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

//Воспользоваться внутренними типами IM
  <font color="#2040a0">ExceptionInfo</font>
      <font color="#2040a0">exception</font><font color="#4444ff">;</font>
  <font color="#2040a0">Image</font>
      <font color="#4444ff">*</font><font color="#2040a0">image</font><font color="#4444ff">;</font>
  <font color="#2040a0">ImageInfo</font>

      <font color="#4444ff">*</font><font color="#2040a0">image_info</font><font color="#4444ff">;</font>
  <font color="#2040a0">PixelPacket</font> 
      <font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">;</font>
  <font color="#2040a0">ViewInfo</font> 
      <font color="#4444ff">*</font><font color="#2040a0">vinfo</font><font color="#4444ff">;</font>

  <strong>int</strong> <font color="#2040a0">i</font>,<font color="#2040a0">j</font>,<font color="#2040a0">w</font>,<font color="#2040a0">h</font><font color="#4444ff">;</font>
// Инициализировать структуру <font color="#2040a0">image</font> <font color="#2040a0">info</font> и прочитать изображение
  <font color="#2040a0">InitializeMagick</font><font color="#4444ff">(</font><font color="#4444ff">*</font><font color="#2040a0">argv</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// установить обработку событий типа ReadError и т.п.
  <font color="#2040a0">GetExceptionInfo</font><font color="#4444ff">(</font><font color="#4444ff">&amp;</font><font color="#2040a0">exception</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
// сделлать копию структуры image info
  <font color="#2040a0">image_info</font><font color="#4444ff">=</font><font color="#2040a0">CloneImageInfo</font><font color="#4444ff">(</font><font color="#4444ff">(</font><font color="#2040a0">ImageInfo</font> <font color="#4444ff">*</font><font color="#4444ff">)</font> <font color="#2040a0">NULL</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// скопировать в структуру имя файла
  <font color="#4444ff">(</font><strong>void</strong><font color="#4444ff">)</font><font color="#2040a0">strcpy</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">filename</font>,<font color="#008000">"image.gif"</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
// прочитать картинку, попутно отработав эксепшены &exception 
  <font color="#2040a0">image</font><font color="#4444ff">=</font><font color="#2040a0">ReadImage</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font>,<font color="#4444ff">&amp;</font><font color="#2040a0">exception</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <strong>if</strong> <font color="#4444ff">(</font><font color="#2040a0">image</font> <font color="#4444ff">=</font><font color="#4444ff">=</font> <font color="#4444ff">(</font><font color="#2040a0">Image</font> <font color="#4444ff">*</font><font color="#4444ff">)</font> <font color="#2040a0">NULL</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

// в случае ошибки
    <font color="#2040a0">fprintf</font><font color="#4444ff">(</font><font color="#2040a0">stderr</font>, <font color="#008000">"readFileMagick: %s: %s<font color="#77dd77">\n</font>"</font>,
    <font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

// <font color="#2040a0">MagickError</font><font color="#4444ff">(</font><font color="#2040a0">exception</font>.<font color="#2040a0">severity</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

    <strong>return</strong> <font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font>
  <font color="#4444ff"><strong>}</strong></font>
// открыть открыть просмотр кеша пикселей
  <font color="#2040a0">vinfo</font> <font color="#4444ff">=</font> <font color="#2040a0">OpenCacheView</font><font color="#4444ff">(</font><font color="#2040a0">image</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">pixels</font> <font color="#4444ff">=</font> <font color="#2040a0">GetCacheView</font><font color="#4444ff">(</font><font color="#2040a0">vinfo</font>, <font color="#ff0000">0</font>,<font color="#ff0000">0</font>,<font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">columns</font>,<font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">rows</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <strong>if</strong><font color="#4444ff">(</font><font color="#4444ff">!</font><font color="#2040a0">pixels</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>
    <font color="#2040a0">fprintf</font><font color="#4444ff">(</font><font color="#2040a0">stderr</font>, <font color="#008000">"readFileMagick: ошибка чтения кеша пикселей.<font color="#77dd77">\n</font>"</font><font color="#4444ff">)</font><font color="#4444ff">;</font> 
    <strong>return</strong><font color="#4444ff">(</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#4444ff"><strong>}</strong></font>
  <font color="#2040a0">h</font> <font color="#4444ff">=</font> <font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">columns</font><font color="#4444ff">;</font> //ширина по горизонтали <font color="#4444ff">(</font>число столбцов картинки<font color="#4444ff">)</font>

  <font color="#2040a0">w</font> <font color="#4444ff">=</font> <font color="#2040a0">image</font><font color="#4444ff">-</font><font color="#4444ff">&gt;</font><font color="#2040a0">rows</font><font color="#4444ff">;</font>    //высота по вертикали   <font color="#4444ff">(</font>число строк картинки<font color="#4444ff">)</font>
// вывести значения пикселов по трем каналам
  <strong>for</strong> <font color="#4444ff">(</font><font color="#2040a0">i</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">w</font><font color="#4444ff">-</font><font color="#ff0000">1</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>

    <strong>for</strong> <font color="#4444ff">(</font><font color="#2040a0">j</font> <font color="#4444ff">=</font> <font color="#ff0000">0</font><font color="#4444ff">;</font> <font color="#2040a0">j</font> <font color="#4444ff">&lt;</font><font color="#4444ff">=</font> <font color="#2040a0">h</font><font color="#4444ff">-</font><font color="#ff0000">1</font><font color="#4444ff">;</font> <font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#4444ff">+</font><font color="#4444ff">)</font> <font color="#4444ff"><strong>{</strong></font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d "</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">blue</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d "</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">green</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

      <font color="#2040a0">printf</font><font color="#4444ff">(</font><font color="#008000">"%d<font color="#77dd77">\n</font>"</font>,<font color="#4444ff">(</font><strong>int</strong><font color="#4444ff">)</font><font color="#ff0000">255</font><font color="#4444ff">*</font><font color="#2040a0">pixels</font><font color="#4444ff">[</font><font color="#2040a0">j</font><font color="#4444ff">+</font><font color="#2040a0">h</font><font color="#4444ff">*</font><font color="#2040a0">i</font><font color="#4444ff">]</font>.<font color="#2040a0">red</font>/<font color="#ff0000">65535</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

    <font color="#4444ff"><strong>}</strong></font>
  <font color="#4444ff"><strong>}</strong></font>
// закрыть и уничтожить все
  <font color="#2040a0">CloseCacheView</font><font color="#4444ff">(</font><font color="#2040a0">vinfo</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
  <font color="#2040a0">DestroyImageInfo</font><font color="#4444ff">(</font><font color="#2040a0">image_info</font><font color="#4444ff">)</font><font color="#4444ff">;</font>

  <font color="#2040a0">DestroyImage</font><font color="#4444ff">(</font><font color="#2040a0">image</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
  <strong>return</strong><font color="#4444ff">(</font><font color="#ff0000">0</font><font color="#4444ff">)</font><font color="#4444ff">;</font>
<font color="#4444ff"><strong>}</strong></font>

</pre>
компилировать программу можно таким <a
href="http://www.magickwand.org/www/api.html">образом</a>:

<pre>
    setenv LD_LIBRARY_PATH /usr/local/lib
    gcc `Magick-config --cflags --cppflags` pixels.c `Magick-config --ldflags --libs`
</pre>
Требования к функции, возвращающей пикселы, следующие: имя файла должно
передаваться в качестве параметра и в нагрузку параметр для чегонибудь
сделания с извлекаемыми пикселами. Функция должна возвращать строку пикселей в
16-тиричном виде и высоту + ширину картинки, необходимые для new_from_data().
Чтобы получить имя картинки в XS, можно воспользоваться следующим
подходом:
<pre>
SV*
pixs (SV * fn, int k)
  INIT:
       unsigned char * lfn;
       STRLEN l;  /* STRLEN is a certain type of int */
       /* ... */
  CODE:
       lfn = SvPV (fn, l); 
</pre>
после этого имя картинки будет содержаться в переменной lfn.
<p>
В целом, на XS вышеприведенная программа выглядит таким образом: 
<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>
// string.h нужен для функции strcpy
<font color="0000ff"><strong>#include <font color="#008000">&lt;string.h&gt;</font></strong></font>
// на всякий случай, для матобработкию. если таковая будет, чтобы не писать при компиляции -lm
<font color="0000ff"><strong>#include <font color="#008000">&lt;math.h&gt;</font></strong></font>
// для ImageMagick
<font color="0000ff"><strong>#include <font color="#008000">&lt;magick/api.h&gt;</font></strong></font>

<font color="0000ff"><strong>#include <font color="#008000">&quot;ppport.h&quot;</font></strong></font>
// определить название модуля, необходимого далее для инициализации ImageMagick
<font color="0000ff"><strong>#define PackageName <font color="#008000">&quot;Pixels&quot;</font></strong></font>
// название модуля и пакетов
<font color="#2040a0">MODULE</font> <font color="4444FF">=</font> <font color="#2040a0">Pixels</font>		<font color="#2040a0">PACKAGE</font> <font color="4444FF">=</font> <font color="#2040a0">Pixels</font>		

// отключить прототипы, о(see perldoc perlxs)
<font color="#2040a0">PROTOTYPES</font><font color="4444FF">:</font> <font color="#2040a0">DISABLE</font>
// Инициализировать ImageMagick (see perldoc perlxs)
<font color="#2040a0">BOOT</font><font color="4444FF">:</font>
  <font color="#2040a0">InitializeMagick</font><font color="4444FF">(</font><font color="#2040a0">PackageName</font><font color="4444FF">)</font><font color="4444FF">;</font>

// скаляр (see perldoc perlguts), функции передаются на вход два параметра,
// имя файла и что-то еще. Тип передаваемых параметров определяется только десь
<font color="#2040a0">SV</font><font color="4444FF">*</font>
<font color="#2040a0">pixs</font><font color="4444FF">(</font><font color="#2040a0">SV</font> <font color="4444FF">*</font><font color="#2040a0">fn</font>, <strong>int</strong> <font color="#2040a0">k</font><font color="4444FF">)</font>

  <font color="#2040a0">INIT</font><font color="4444FF">:</font>
//Воспользоваться внутренними типами IM
        <font color="#2040a0">ExceptionInfo</font>
          <font color="#2040a0">exception</font><font color="4444FF">;</font>
        <font color="#2040a0">Image</font>
          <font color="4444FF">*</font><font color="#2040a0">image</font><font color="4444FF">;</font>

        <font color="#2040a0">ImageInfo</font>
          <font color="4444FF">*</font><font color="#2040a0">info</font>,
          <font color="4444FF">*</font><font color="#2040a0">image_info</font><font color="4444FF">;</font>
        <font color="#2040a0">PixelPacket</font>
          <font color="4444FF">*</font><font color="#2040a0">pixels</font><font color="4444FF">;</font>

        <font color="#2040a0">ViewInfo</font>
          <font color="4444FF">*</font><font color="#2040a0">vinfo</font><font color="4444FF">;</font>
// определить двумерные массивы для хранения пикселов
        <strong>int</strong> <font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sm</font>,<font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sym</font>,<font color="#2040a0">i</font>,<font color="#2040a0">j</font><font color="4444FF">;</font>

// переменные для имени  файла и возвращаемого значения пикселов
        <strong>unsigned</strong> <strong>char</strong> <font color="4444FF">*</font> <font color="#2040a0">lfn</font>, <font color="4444FF">*</font> <font color="#2040a0">number</font><font color="4444FF">;</font>
// определение STRLEN находится в файле config.h (perldoc perlguts)
        <font color="#2040a0">STRLEN</font> <font color="#2040a0">t</font><font color="4444FF">;</font> 

// определение типа данных для хеша и для массива *только для XSUBs* (perldoc perlguts)
        <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">CODE</font><font color="4444FF">:</font>
// присваивание имени, впрочем, это описано в perldoc perlguts
        <font color="#2040a0">lfn</font> <font color="4444FF">=</font> <font color="#2040a0">SvPV</font> <font color="4444FF">(</font><font color="#2040a0">fn</font>,<font color="#2040a0">t</font><font color="4444FF">)</font><font color="4444FF">;</font>

// установить обработку событий типа ReadError и т.п.
        <font color="#2040a0">GetExceptionInfo</font><font color="4444FF">(</font><font color="4444FF">&amp;</font><font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>
// сделлать копию структуры image info
        <font color="#2040a0">image_info</font><font color="4444FF">=</font><font color="#2040a0">CloneImageInfo</font><font color="4444FF">(</font><font color="4444FF">(</font><font color="#2040a0">ImageInfo</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font><font color="4444FF">;</font>

// скопировать в структуру имя файла
        <font color="#2040a0">strcpy</font><font color="4444FF">(</font><font color="#2040a0">image_info</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">filename</font>, <font color="#2040a0">lfn</font><font color="4444FF">)</font><font color="4444FF">;</font>
// прочитать картинку, попутно отработав эксепшены &exception 
        <font color="#2040a0">image</font><font color="4444FF">=</font><font color="#2040a0">ReadImage</font><font color="4444FF">(</font><font color="#2040a0">image_info</font>,<font color="4444FF">&amp;</font><font color="#2040a0">exception</font><font color="4444FF">)</font><font color="4444FF">;</font>

// в случае ошибки
        <strong>if</strong> <font color="4444FF">(</font><font color="#2040a0">image</font> <font color="4444FF">=</font><font color="4444FF">=</font> <font color="4444FF">(</font><font color="#2040a0">Image</font> <font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">NULL</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>     
          <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;readFileMagick: %s: %s<font color="#77dd77">\n</font>&quot;</font>,
          <font color="#2040a0">exception</font>.<font color="#2040a0">reason</font>,<font color="#2040a0">exception</font>.<font color="#2040a0">description</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// открыть просмотр кеша пикселей
        <font color="#2040a0">vinfo</font> <font color="4444FF">=</font> <font color="#2040a0">OpenCacheView</font><font color="4444FF">(</font><font color="#2040a0">image</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">pixels</font> <font color="4444FF">=</font> <font color="#2040a0">GetCacheView</font><font color="4444FF">(</font><font color="#2040a0">vinfo</font>, <font color="#FF0000">0</font>,<font color="#FF0000">0</font>,<font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">columns</font>,<font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">rows</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>int</strong> <font color="#2040a0">h</font><font color="4444FF">=</font><font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">columns</font><font color="4444FF">;</font> //ширина по горизонтали <font color="4444FF">(</font>число столбцов<font color="4444FF">)</font>
        <strong>int</strong> <font color="#2040a0">w</font><font color="4444FF">=</font><font color="#2040a0">image</font><font color="4444FF">-</font><font color="4444FF">&gt;</font><font color="#2040a0">rows</font><font color="4444FF">;</font>    //высота по вертикали   <font color="4444FF">(</font>число строк<font color="4444FF">)</font>

// занести данные о высоте и ширине картинки в массив, который будет
// сопоставлен с ключом хеша arr
        <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">h</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">w</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>int</strong> <font color="#2040a0">small</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">*</font><font color="#2040a0">h</font><font color="4444FF">*</font><font color="#FF0000">3</font><font color="4444FF">;</font>
// выделение памяти для строки возвращаемых пикселов, длина строки должна
// быть равна определенной выше small.
        <font color="#2040a0">number</font><font color="4444FF">=</font><font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">small</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">number</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

// отработка ошибки, если возникнут проблемы с pixels
        <strong>if</strong><font color="4444FF">(</font><font color="4444FF">!</font><font color="#2040a0">pixels</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>
          <font color="#2040a0">fprintf</font><font color="4444FF">(</font><font color="#2040a0">stderr</font>, <font color="#008000">&quot;readFileMagick: unable to get pixel cache.<font color="#77dd77">\n</font>&quot;</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// выделение памяти для двумерных массивово
        <font color="#2040a0">sm</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">w</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</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="#2040a0">w</font><font color="4444FF">;</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">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font> <font color="4444FF">(</font> <font color="#2040a0">h</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
        <font color="#2040a0">sym</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font><font color="4444FF">(</font><font color="#2040a0">w</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</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="#2040a0">w</font><font color="4444FF">;</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">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#2040a0">malloc</font> <font color="4444FF">(</font> <font color="#2040a0">h</font> <font color="4444FF">*</font> <strong>sizeof</strong><font color="4444FF">(</font><font color="4444FF">*</font><font color="4444FF">*</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="4444FF"><strong>}</strong></font>
// заполнение массива пикселей для дальнейшей обработки
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</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">w</font><font color="4444FF">-</font><font color="#FF0000">1</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>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="4444FF"><strong>{</strong></font>

            <font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>int</strong><font color="4444FF">)</font><font color="#FF0000">255</font><font color="4444FF">*</font><font color="#2040a0">pixels</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">+</font><font color="#2040a0">h</font><font color="4444FF">*</font><font color="#2040a0">i</font><font color="4444FF">]</font>.<font color="#2040a0">blue</font>/<font color="#FF0000">65535</font><font color="4444FF">;</font>

            <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

          <font color="4444FF"><strong>}</strong></font>
        <font color="4444FF"><strong>}</strong></font>
// математическая обработка пикселей, алгоритм подробно описан <a href=http://genphys.phys.msu.ru/~dmitriyk/site/mv/Smai/smai.html>здесь</a> и  <a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html#smai">здесь немного</a>
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">i</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">w</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">-</font><font color="#2040a0">k</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>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

            <strong>int</strong> <font color="#2040a0">summ</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font>
            <strong>int</strong> <font color="#2040a0">ii</font>,<font color="#2040a0">jj</font><font color="4444FF">;</font>
            <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">ii</font><font color="4444FF">=</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">ii</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">ii</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

              <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">jj</font><font color="4444FF">=</font><font color="4444FF">-</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">jj</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">k</font><font color="4444FF">;</font> <font color="#2040a0">jj</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font> <font color="#2040a0">summ</font><font color="4444FF">+</font><font color="4444FF">=</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">+</font><font color="#2040a0">ii</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">+</font><font color="#2040a0">jj</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="4444FF"><strong>}</strong></font>
            <font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>int</strong><font color="4444FF">)</font><font color="#2040a0">summ</font>/<font color="4444FF">(</font><font color="4444FF">(</font><font color="#FF0000">2</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="4444FF">(</font><font color="#FF0000">2</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="4444FF">;</font>

          <font color="4444FF"><strong>}</strong></font>
        <font color="4444FF"><strong>}</strong></font>
        <strong>int</strong> <font color="#2040a0">count</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font>
// заполнение массива пикселей, которые будут возвращаться в perl-программу по ключу хеша uns
        <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">i</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">w</font><font color="4444FF">-</font><font color="#FF0000">1</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>

          <strong>for</strong> <font color="4444FF">(</font><font color="#2040a0">j</font><font color="4444FF">=</font><font color="#FF0000">0</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">&lt;</font><font color="4444FF">=</font><font color="#2040a0">h</font><font color="4444FF">-</font><font color="#FF0000">1</font><font color="4444FF">;</font> <font color="#2040a0">j</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">)</font><font color="4444FF"><strong>{</strong></font>

            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
            <font color="#2040a0">number</font><font color="4444FF">[</font><font color="#2040a0">count</font><font color="4444FF">]</font><font color="4444FF">=</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">)</font><font color="#2040a0">sym</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">[</font><font color="#2040a0">j</font><font color="4444FF">]</font><font color="4444FF">;</font>

            <font color="#2040a0">count</font><font color="4444FF">+</font><font color="4444FF">+</font><font color="4444FF">;</font>
          <font color="4444FF"><strong>}</strong></font>
//освободить память из под массивов 
          <font color="#2040a0">free</font> <font color="4444FF">(</font><font color="#2040a0">sm</font><font color="4444FF">[</font><font color="#2040a0">i</font><font color="4444FF">]</font><font color="4444FF">)</font><font color="4444FF">;</font>

          <font color="#2040a0">free</font> <font color="4444FF">(</font><font color="#2040a0">sym</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">free</font><font color="4444FF">(</font><font color="#2040a0">sm</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">free</font><font color="4444FF">(</font><font color="#2040a0">sym</font><font color="4444FF">)</font><font color="4444FF">;</font>
// закрыть и уничтожить все
        <font color="#2040a0">CloseCacheView</font><font color="4444FF">(</font><font color="#2040a0">vinfo</font><font color="4444FF">)</font><font color="4444FF">;</font>
        <font color="#2040a0">DestroyImageInfo</font><font color="4444FF">(</font><font color="#2040a0">image_info</font><font color="4444FF">)</font><font color="4444FF">;</font>

        <font color="#2040a0">DestroyImage</font><font color="4444FF">(</font><font color="#2040a0">image</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;arr&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>

// добавить в значение хеша строку unsigned char, которая ассоциируется с ключем uns
// четвертым параметром идет выделение памяти для переменной number
        <font color="#2040a0">hv_store</font><font color="4444FF">(</font><font color="#2040a0">hash</font>, <font color="#008000">&quot;uns&quot;</font>,<font color="#FF0000">3</font>, <font color="#2040a0">newSVpv</font> <font color="4444FF">(</font><font color="4444FF">(</font><strong>unsigned</strong> <strong>char</strong><font color="4444FF">*</font><font color="4444FF">)</font> <font color="#2040a0">number</font>, <font color="#2040a0">small</font><font color="4444FF">*</font><strong>sizeof</strong><font color="4444FF">(</font><font color="#2040a0">number</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">free</font><font color="4444FF">(</font><font color="#2040a0">number</font><font color="4444FF">)</font><font color="4444FF">;</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">hash</font><font color="4444FF">)</font><font color="4444FF">;</font>

// прагма (?) RETVAL возвращает ссылку на хеш (perldoc perlguts).
  <font color="#2040a0">OUTPUT</font><font color="4444FF">:</font>
      <font color="#2040a0">RETVAL</font>

</pre>
Чтобы сделать модуль, который будет вызываться в perl-программе, нужно
сделать следующее:
<pre>
[vilfred@mobile100 xxx]$ h2xs -A -n Pixels
Defaulting to backwards compatibility with perl 5.8.3
If you intend this module to be compatible with earlier perl versions,
please
specify a minimum perl version with the -b option.

Writing Pixels/ppport.h
Writing Pixels/lib/Pixels.pm
Writing Pixels/Pixels.xs
Writing Pixels/Makefile.PL
Writing Pixels/README
Writing Pixels/t/Pixels.t
Writing Pixels/Changes
Writing Pixels/MANIFEST
[vilfred@mobile100 xxx]$
</pre>
Эта команда создаст каталог со всеми необходимыми для компиляции и
дальнейшего использования файлами. Т.к. компилирование c-шного файла
требовало подключения библиотек ImageMagick, то нужно подправить
Makefile.PL:
<pre>
    LIBS              => ['-L/usr/lib -lMagick -L/usr/X11R6/lib -lfreetype -lz \
-L/usr/lib -ltiff -lfreetype -ljpeg -lXext -lSM -lICE -lX11 -lXt \
-lbz2 -lz -lpthread -lm -lpthread'], # e.g., '-lm'

</pre>
<p align=justify>
После этого вносятся соответствующие правки в текст Pixels.xs и далее идут
команды perl Makefile.PL, make и make test. Т.к. модуль Pixels.pm не установлен (не было
команды make install), то необходимо вновь написанный модуль каким-то
образом вызвать в perl-скрипте. Nick Ing-Simmons написал библиотеку blib
(perldoc blib), которая находит необходимый модуль.<p>
Соответствующий perl-код <a href=xgui.pl>такой</a>,(с подсвеченным
синтаксисом 
<a href="xgui.html">html</a>).

Вобщем, что то в этом роде...
<p>
<center>
screenshot<p>
<img src="http://genphys.phys.msu.ru/%7Edmitriyk/site/mv/proga.jpg">
</center>
<p>
<a href="http://genphys.phys.msu.ru/~dmitriyk/site/mv/contur/aircrafrs.html">samolet</a> | <a href=xs.html>Предыдущая</a> | Извлечение пикселей | to be continued...

<p>
]]></description>
</item>
<item>
<title>Вызов функции, написанной на языке С из программы на языке perl</title>
<link>https://rulinux.net/message.php?newsid=34857&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34857&amp;page=1</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>
<item>
<title>perl регулярные выражения</title>
<link>https://rulinux.net/message.php?newsid=34868&amp;page=1</link>
<guid>https://rulinux.net/message.php?newsid=34868&amp;page=1</guid>
<pubDate>Sat, 13 Feb 2010 21:20:00 +0300</pubDate>
<description><![CDATA[test]]></description>
</item>
</channel>
</rss>