<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3134575</guid>
        <pubDate>Sat, 12 May 2012 03:51:06 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3134575</link>
        <description><![CDATA[Tishaishii: test.pl<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">undef ( $/ ) ; # отключаю разделение потока. По-умолчанию делится на звенья по символу &#39;\n&#39;.</div><div class="code_line">my $str = &#60;&#62; ; # читаю входной поток</div><div class="code_line">&nbsp;</div><div class="code_line">while ( &#60;DATA&#62; ) { # читаю дополнительные данные из программного файла</div><div class="code_line">&nbsp;&nbsp; &nbsp;next unless m{ &nbsp; &nbsp; &nbsp;# разбираю дополнительные данные. Эквивалентно: chomp ( $_ ) ; split ( /\t+/os , $_ , 2 ) ;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;^ &nbsp; &nbsp; &nbsp; # начало каждой строки</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(.*?) &nbsp; &nbsp; &nbsp; # любой набор символов до символа &#39;\t&#39;, запомнить в </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;\t+ &nbsp; &nbsp; # набор символов &#39;\t&#39; в количестве &#62;= 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;([^\r\n]+) &nbsp;# набор символов &#39;\r&#39; и &#39;\n&#39; в количестве &#62;= 1, запомнить в </div><div class="code_line">&nbsp;&nbsp; &nbsp;}osx ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my ( $rx , $expr ) = ( qr()is ,  ) ; &nbsp; &nbsp;#  представить как регулярное выражение,  - выражение для подстановки как строка.</div><div class="code_line">&nbsp;&nbsp; &nbsp;$str =~ s{$rx}{$expr}egex ; # провести замену в $str. Двойной флаг &quot;e&quot; указывает на то, что строку подстановки следует представлять как выполняемый код.</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">print ( $str ) ; # вывод результата в STDOUT</div><div class="code_line">&nbsp;</div><div class="code_line"># в результате произведутся последовательные преобразования исходной строки с помощью перечисленных регулярных выражений и строк для подстановки.</div><div class="code_line">&nbsp;</div><div class="code_line">__DATA__</div><div class="code_line">п(.).+?(л) &nbsp; .  .  .  .  . substr( $&#39; , 0, 1 )</div><div class="code_line">к &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $&amp; . &#39;у&#39; . $&amp; . &#39;уш&#39; . $&amp; . &#39;а&#39;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
применять можно так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">perl test.pl test.txt</div></ol></div></div></div></div><br>
<br>
test.txt - файл с исходным текстом.]]></description>
        <author>Tishaishii</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3129170</guid>
        <pubDate>Wed, 02 May 2012 06:45:55 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3129170</link>
        <description><![CDATA[Romtek: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=326559&view=findpost&p=3129123'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Tishaishii &#064; <time class="tag-quote__quoted-time" datetime="2012-05-02T03:59:42+00:00">02.05.12, 03:59</time></span><div class='quote '>К теме.</div></div><br>
Поясни код, будь добр.]]></description>
        <author>Romtek</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3129123</guid>
        <pubDate>Wed, 02 May 2012 03:59:42 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3129123</link>
        <description><![CDATA[Tishaishii: К теме.]]></description>
        <author>Tishaishii</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3127576</guid>
        <pubDate>Fri, 27 Apr 2012 19:11:31 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3127576</link>
        <description><![CDATA[Romtek: <strong class='tag-b'>Tishaishii</strong>, к чему этот код?]]></description>
        <author>Romtek</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3126774</guid>
        <pubDate>Fri, 27 Apr 2012 04:32:04 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=3126774</link>
        <description><![CDATA[Tishaishii: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">my $str = &#60;&#60;&#39;.&#39; ;</div><div class="code_line">У попа была собака, он её любил.</div><div class="code_line">Затем, она съела кусок мяса.</div><div class="code_line">.</div><div class="code_line">&nbsp;</div><div class="code_line">while ( &#60;DATA&#62; ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;next unless m{^(.*?)\t+([^\r\n]+)}os ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my ( $rx , $expr ) = ( qr()is ,  ) ;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$str =~ s{$rx}{$expr}egex;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">print ( $str ) ;</div><div class="code_line">&nbsp;</div><div class="code_line">__DATA__</div><div class="code_line">п(.).+?(л) .  .  .  .  . substr( $&#39; , 0, 1 )</div><div class="code_line">к &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$&amp; . &#39;у&#39; . $&amp; . &#39;уш&#39; . $&amp; . &#39;а&#39;</div></ol></div></div></div></div>]]></description>
        <author>Tishaishii</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2841123</guid>
        <pubDate>Mon, 28 Feb 2011 11:03:03 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2841123</link>
        <description><![CDATA[Romtek: &quot;Выкрутился&quot; временным решением, указав подстановки прямо в коде. Но это неверный подход и я ещё расчитываю на простое решение.<br>
Пробовал применить <strong class='tag-b'>eval</strong>, но выдаётся много сообений &quot;Use of uninitialized value in concatenation (.) or string at ...&quot;<br>
<br>
Привожу исходный код для примитивного перевода программы с Object Pascal/Delphi в Component Pascal. Основная таблица замен выражений описана в файле Pas2Cp.txt.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#!/usr/bin/env perl</div><div class="code_line">&nbsp;</div><div class="code_line">use strict;</div><div class="code_line">use warnings;</div><div class="code_line">&nbsp;</div><div class="code_line">my (@conv_table, $x);</div><div class="code_line">&nbsp;</div><div class="code_line">open(my $in, &nbsp;&quot;&#60;&quot;, &nbsp;&quot;Pas2Cp.txt&quot;) &nbsp;or die &quot;Can&#39;t open file with definitions!&quot;;</div><div class="code_line">while (&#60;$in&#62;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;chomp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my ($expr, $repl) = split /\t/;</div><div class="code_line">&nbsp;&nbsp; &nbsp;push(@conv_table, [$expr, $repl]);</div><div class="code_line">}</div><div class="code_line">close $in or die &quot;$in: $!&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">while (&#60;&#62;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;chomp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;my $line = $_;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/\/\/(.*)$/(*  *)/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/$([0-9A-F]+?)\b/0H/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/\#(\d+?)\b/0X/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/\barray\s*\[(.+?)\]/ARRAY  /ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/\^([A-Za-z_]+)/POINTER TO /ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/Result\s*:=\s*([^;]+?)/result := /ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/FreeMem\((.+)\)/ := NIL/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;$line =~ s/Dispose\((.+)\)/ := NIL/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;foreach (@conv_table) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$line =~ s/$$_[0]/$$_[1]/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;#~ eval &quot;$line =~ s/$$_[0]/&quot; . $$_[1] . &quot;/ig&quot;; &nbsp;# эта строка приводит к ошибкам</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;print &quot;$line\n&quot;;</div><div class="code_line">}</div></ol></div></div></div></div><br>
В общем, код справляется с поставленной задачей, но хотелось бы избавиться от строк <span class="tag-color tag-color-named" data-value="orange" style="color: orange">&#036;line =~ s///ig;</span>]]></description>
        <author>Romtek</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2841060</guid>
        <pubDate>Mon, 28 Feb 2011 09:56:11 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2841060</link>
        <description><![CDATA[Adil: Попробу с eval:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;foreach (@conv_table) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;eval &quot;$line =~ s/$$_[0]/&quot; . $$_[1] . &quot;/ig&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div>]]></description>
        <author>Adil</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2840072</guid>
        <pubDate>Sat, 26 Feb 2011 19:21:43 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2840072</link>
        <description><![CDATA[Nadz Goldman: А можно код?]]></description>
        <author>Nadz Goldman</author>
        <category>Perl</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2838460</guid>
        <pubDate>Thu, 24 Feb 2011 17:48:21 +0000</pubDate>
        <title>&amp;quot;Хитрые&amp;quot; подстановки</title>
        <link>https://forum.sources.ru/index.php?showtopic=326559&amp;view=findpost&amp;p=2838460</link>
        <description><![CDATA[Romtek: Пишу <s class='tag-s'>тупой</s> примитивный и незаковыристый транслятор с одного языка на другой, используя файл с описаниями регулярных выражений и их подстановок.<br>
<br>
Есть такой кусок кода (см. примечания ниже):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;foreach (@conv_table) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$line =~ s/$$_[0]/$$_[1]/ig;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>@conv_table</strong> содержит в каждом члене (или элементе, если вам так угодно) пару: регулярное выражение и строка для подстановки, включающая &#036;1, &#036;2, ... (по необходимости). К примеру,<br>
<table class='post_table tag-table'><tr><td>&#092;&#036;(&#092;d+)</td><td>0&#036;1H</td></tr></table><br>
<br>
Проблема заключается в том, что вместо найденных значений подставляются &#036;1, &#036;2,...]]></description>
        <author>Romtek</author>
        <category>Perl</category>
      </item>
	
      </channel>
      </rss>
	