<?xml version='1.0' encoding='utf-8' ?>
<!--  If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/  -->
<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Записки проperl</title>
  <link>http://ocehb.livejournal.com/</link>
  <description>Записки проperl - LiveJournal.com</description>
  <lastBuildDate>Fri, 11 May 2012 07:26:41 GMT</lastBuildDate>
  <generator>LiveJournal / LiveJournal.com</generator>
  <lj:journal>ocehb</lj:journal>
  <lj:journalid>1121343</lj:journalid>
  <lj:journaltype>personal</lj:journaltype>
  <atom10:link rel='hub' href='http://pubsubhubbub.appspot.com/' />
  <image>
    <url>http://l-userpic.livejournal.com/5702211/1121343</url>
    <title>Записки проperl</title>
    <link>http://ocehb.livejournal.com/</link>
    <width>90</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/55710.html</guid>
  <pubDate>Fri, 11 May 2012 07:26:41 GMT</pubDate>
  <title>если в слове хлеб сделать четыре ошибки...</title>
  <link>http://ocehb.livejournal.com/55710.html</link>
  <description>то получится слово пиво.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# setopt multibyte
# touch пиво
# print -l (#a4)хлеб
пиво
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;#&lt;/code&gt; &amp;mdash; в скобках модификатор&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;4&lt;/code&gt; &amp;mdash; количество шибок, которые можно совершить при поиске&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://arto.homeunix.org/images/approximate-matching.gif&quot; /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;ps.&lt;pre&gt;&lt;code&gt;# [[ mislpeld == (#a3)misspelled ]] &amp;&amp; print yes
yes
# [[ mislpeld == (#a2)misspelled ]] &amp;&amp; print yes    
#&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/55710.html</comments>
  <category>zsh</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/55550.html</guid>
  <pubDate>Thu, 10 May 2012 07:19:09 GMT</pubDate>
  <title>Генерация имен хостов для ssh-дополнений</title>
  <link>http://ocehb.livejournal.com/55550.html</link>
  <description>Перечитал zshexpn, приемы для работы с файлами.&lt;br /&gt;&lt;br /&gt;В zsh можно сконфигурировать стиль для дополнений ssh, который по tab генерирует дополнения для, например, имени хоста. Логично брать их из &lt;code&gt;~/.ssh/config&lt;/code&gt; и &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt;.&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Форматы пересказывать не буду, их можно посмотрать по манам.&lt;br /&gt;1. Разбор ~/.ssh/config, будем брать имена из строки &lt;code&gt;Host name&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;${${&quot;${(@M)${(f)&quot;$(&amp;lt; ~/.ssh/config)&quot;}:#Host[[:space:]]#[[:alnum:]]#}&quot;}##* }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Легенда:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;$(&amp;lt; ~/.ssh/config)&lt;/code&gt; читаем файл, результат &amp;mdash; массив строк, разбитых по пробелам&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;&quot;$(&amp;lt; ~/.ssh/config)&quot;&lt;/code&gt;, результат &amp;mdash; файл, как он есть, без разбивки&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${(f)&quot;$(&amp;lt; ~/.ssh/config)}&lt;/code&gt; &amp;mdash; разбиваем контент по строкам, получаем массив строк&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${(@M)${(f)&quot;$(&amp;lt; ~/.ssh/config)&quot;}:#Host[[:space:]]#[[:alnum:]]#}&lt;/code&gt; &amp;mdash; удаляем все, что не попадает под выражение &lt;code&gt;Host[[:space:]]#[[:alnum:]]#&lt;/code&gt;:&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;В zsh можно использовать классы символов, как &lt;code&gt;[:space:]&lt;/code&gt; класс пробелов и &lt;code&gt;[:alnum:]&lt;/code&gt; класс алфавитно-цифровых символов. Символ &lt;code&gt;#&lt;/code&gt; после класса обозначает повторение, для pcre это совпадает с &lt;code&gt;Host\s+\w+&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;&lt;code&gt;:#&lt;/code&gt; удалят из массива совпадающие с паттерном элементы, флаг &lt;code&gt;M&lt;/code&gt; меняет действие на противоположное, удаляет не совпадающие элементы&lt;/li&gt;&lt;br /&gt;    &lt;li&gt;Флаг &lt;code&gt;@&lt;/code&gt; показывает, что имеем дело с массивом.&lt;br /&gt;  &lt;/ul&gt;&lt;br /&gt;  &lt;p&gt;Результат:&lt;pre&gt;&lt;code&gt;
# print -l ${&quot;${(M@)${(f)&quot;$(&amp;lt; ~/.ssh/config)&quot;}:#Host[[:space:]]#[[:alnum:]]#}&quot;}     
Host roof
Host arto
Host book
Host sut
Host ftp2
...
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${${&quot;${(M@)${(f)&quot;$(&amp;lt; ~/.ssh/config)&quot;}:#Host[[:space:]]#[[:alnum:]]#}&quot;}##* }&lt;/code&gt; &amp;mdash; удаляет в каждом элементе массива подстроку сначала и до последнего пробела, оставляя имя хоста:&lt;p&gt;&lt;code&gt;&lt;pre&gt;
# print -l ${${&quot;${(M@)${(f)&quot;$(&amp;lt; ~/.ssh/config)&quot;}:#Host[[:space:]]#[[:alnum:]]#}&quot;}##* }
roof
arto
book
sut
ftp2
...
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Для perl это будет выглядеть так: &lt;code&gt;perl -lne &apos;m#Host\s+(\w+)# &amp;&amp; print $1&apos; ~/.ssh/config&lt;/code&gt;, но порождается один дополнительный процесс.&lt;br /&gt;&lt;br /&gt;2. Разбор &lt;code&gt;~/.ssh/known_hosts&lt;/code&gt;, хотим брать нормальные имена хостов, ip-адреса и адреса с портом (&lt;code&gt;[host]:port&lt;/code&gt;) брать не будем:&lt;br /&gt;&lt;p&gt;&lt;pre&gt;&lt;code&gt;# print -l ${${${&quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;%%[ ,]*}:#\[*\]:*}:#[0-9]#.[0-9]#.[0-9]#.[0-9]#} 
roof.***.ru
book.***.ru
cube.***.ru
ftp2.***.ru
...&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;br /&gt;Легенда:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;$(&amp;lt; ~/.ssh/known_hosts)&lt;/code&gt; &amp;mdash; читаем весь файл, с разбивкой по пробелам&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;&lt;/code&gt; &amp;mdash; весь файл без разбивок&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&lt;/code&gt; &amp;mdash; разбиваем контент по строчкам&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;&quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;&lt;/code&gt; &amp;mdash; экранируем каждый элемент массива (там могут попадаться спецсимволы, например &lt;code&gt;[&lt;/code&gt; и &lt;code&gt;]&lt;/code&gt;), результат:&lt;p&gt;&lt;pre&gt;&lt;code&gt;# print -l &quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;
roof.***.ru,195.***.130 ssh-dss AAAAB3NzaC1kc3MAAAC...
book.***.ru,195.***.246 ssh-rsa AAAAB3NzaC1yc2EAAAA...
...&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${&quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;%%[ ,]*}&lt;/code&gt; &amp;mdash; удаляем теги и ключи, всё после пробела или запятой (&lt;code&gt;%%[ ,]*&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${${&quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;%%[ ,]*}:#\[*\]:*}&lt;/code&gt; &amp;mdash; удаляем (&lt;code&gt;#:&lt;/code&gt;) все элементы массива, совпадающие с паттерном (&lt;code&gt;\[*\]:*&lt;/code&gt;, например &lt;code&gt;[www.abc.ru]:22222&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;${${${&quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;%%[ ,]*}:#\[*\]:*}:#[0-9]#.[0-9]#.[0-9]#.[0-9]#}&lt;/code&gt; &amp;mdash; удляем элементы массива (&lt;code&gt;#:&lt;/code&gt;) совпадающие с ip-адресом (&lt;code&gt;[0-9]#.[0-9]#.[0-9]#.[0-9]#&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Теперь можно проверить:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# zstyle &apos;:completion:*:(ssh|scp|sftp):*&apos; hosts ${(o)${${&quot;${(f)&quot;$(&amp;lt; ~/.ssh/known_hosts)&quot;}&quot;%%[ ,]*}:#\[*\]:*}:#[0-9]#.[0-9]#.[0-9]#.[0-9]#}
# ssh &amp;lt;TAB&amp;gt;
roof.***.ru    book.***.ru    cube.***.ru    ftp2.***.ru
...
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;img src=&quot;http://arto.homeunix.org/images/zshell-mini.png&quot; /&gt;&lt;/p&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/55550.html</comments>
  <category>zsh</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/55065.html</guid>
  <pubDate>Wed, 09 May 2012 08:28:41 GMT</pubDate>
  <title>JFYI</title>
  <link>http://ocehb.livejournal.com/55065.html</link>
  <description>В zsh появился новый флаг квалификации глобов &amp;mdash; &lt;code&gt;F&lt;/code&gt;, непустой каталог.&lt;br /&gt;Т. е. теперь можно удалить все пустые каталоги одной командой:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
zsh# rmdir *(/N^F)
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Легенда:&lt;br /&gt;&lt;ul compact=&quot;1&quot;&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;*&lt;/code&gt; &amp;mdash; все файлы в текущем каталоге&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;/&lt;/code&gt; &amp;mdash; из них все каталоги&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;N&lt;/code&gt; &amp;mdash; если ничего не встретилось, то не генерим ошибку&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;^F&lt;/code&gt; &amp;mdash; из оставшегося выбираем только &lt;em&gt;пустые&lt;/em&gt; каталоги&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Удобно.&lt;br /&gt;Время перечитать внимательно zshexpn и zshcontrib :).&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/images/from-bash-to-zshell.png&quot; /&gt;</description>
  <comments>http://ocehb.livejournal.com/55065.html</comments>
  <category>zsh</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/54884.html</guid>
  <pubDate>Wed, 02 May 2012 17:17:42 GMT</pubDate>
  <title>Яндекс почта</title>
  <link>http://ocehb.livejournal.com/54884.html</link>
  <description>&lt;pre&gt;&lt;code&gt;
# for i in {1..100}; do
  HEAD http://mailstatic.yandex.net/neo/1.12.9/v2/page/common.css | \
  head -1; done | grep 404 | wc -l; done
20
#
&lt;/code&gt;&lt;/pre&gt;</description>
  <comments>http://ocehb.livejournal.com/54884.html</comments>
  <category>humor</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/54676.html</guid>
  <pubDate>Tue, 14 Feb 2012 21:42:21 GMT</pubDate>
  <title>Нахождение простых чисел</title>
  <link>http://ocehb.livejournal.com/54676.html</link>
  <description>решето эратосфена (числа не больше данного)&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
#  perl -le &apos;@a = ( 2..$ARGV[0] );
  while (@a) { my $a = shift @a; $a ? print $a : next;
  for (my $i = $a-1; $i &amp;lt; $#a+1; $i += $a) { $a[$i] = 0 } }&apos; 100
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Прямое вычисление (количество чисел):&lt;br /&gt;&lt;a name=&quot;cutid2&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# perl -le &apos;@a = ( $n = 2 );
  n: while ($n++, $#a &amp;lt; $ARGV[0]-1) {
    foreach (@a) { next n if ($n%$_ == 0) }
    push @a, $n 
  }
  END{ print join &quot;\n&quot;, @a }&apos; 25
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name=&apos;cutid2-end&apos;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ну и сравнение производительности:&lt;br /&gt;Решето:&lt;br /&gt;&lt;code&gt;Real: 0.35s User: 0.32s System: 0.01s Percent: 97%% Cmd: perl -le  102400&lt;/code&gt;&lt;br /&gt;Прямое вычисление:&lt;br /&gt;&lt;code&gt;Real: 17.65s User: 17.56s System: 0.00s Percent: 99%% Cmd: perl -le  9805&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/images/resheto-eratosfena.jpg&quot; /&gt;</description>
  <comments>http://ocehb.livejournal.com/54676.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/54413.html</guid>
  <pubDate>Wed, 25 Jan 2012 08:26:50 GMT</pubDate>
  <title>Задачка</title>
  <link>http://ocehb.livejournal.com/54413.html</link>
  <description>&lt;cite&gt;есть 2 бесконечно больших текстовых файла отсортированных лексикографически.&lt;br /&gt;Нужно найти разницу и записать в файлы.&lt;/cite&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
open A, shift or die;
open B, shift or die;

my $h = 0;
while (!(eof(A) &amp;&amp; eof(B)) ) {
    ( $a, $b ) = $h == 0 ?
        ( scalar &amp;lt;A&amp;gt;, scalar &amp;lt;B&amp;gt; ) : $h == 1 ?
        ( $a, scalar &amp;lt;B&amp;gt; ) : ( scalar &amp;lt;A&amp;gt;, $b );
    print &quot;&amp;lt; $a&quot; and next unless (defined $b);
    print &quot;&amp;gt; $b&quot; and next unless (defined $a);
    $h = $a cmp $b or next;
    print $h == 1 ? &quot;&amp;gt; $b&quot; : &quot;&amp;lt; $a&quot;;
} 
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;в принципе, можно сократить 2 строчки, но было лень разбираться с &lt;code&gt;$h = $a cmp $b or next;&lt;/code&gt;...&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/cgi/track.pl?diff&quot; /&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/54413.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/54218.html</guid>
  <pubDate>Fri, 20 Jan 2012 06:21:22 GMT</pubDate>
  <title>Look-Around Assertions в операторе s///</title>
  <link>http://ocehb.livejournal.com/54218.html</link>
  <description>До сих пор не задумывался на эту тему, но работает. Пример:&lt;br /&gt;&lt;cite&gt;Задание: Удалить все знаки «+», за которыми следует цифра.&lt;/cite&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# perl -le &apos;$ARGV[0] =~ s#\+(?=\d)##g &amp;&amp; print $ARGV[0]&apos; &quot;+test + +12 +13 ++&quot;
+test + 12 13 ++
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/images/psilocybin.jpg&quot; /&gt;</description>
  <comments>http://ocehb.livejournal.com/54218.html</comments>
  <category>perl</category>
  <category>perl regexp</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/53891.html</guid>
  <pubDate>Thu, 22 Dec 2011 06:35:59 GMT</pubDate>
  <title>Задачка про CIDR</title>
  <link>http://ocehb.livejournal.com/53891.html</link>
  <description>&lt;a href=&quot;http://nponeccop.livejournal.com/225261.html?style=mine&quot;&gt;Отсюда&lt;/a&gt;:&lt;br /&gt;&lt;cite&gt;Задача такова: есть ASCIIZ-строка с IP-адресом, надо вернуть true, если этот адрес попадает в один из диапазонов, перечисленных в файле.&lt;br /&gt;&lt;br /&gt;Файл текстовый такого формата,&lt;br /&gt;&lt;br /&gt;192.168.1.3,192.168.1.5&lt;br /&gt;192.168.2.4,193.0.0.3&lt;br /&gt;&lt;br /&gt;Файл не отсортирован, дипапазоны произвольные и могут пересекаться. Первый адрес меньше второго или равен ему. Пересечение диапазонов можно обрабатывать двумя путями: лиюо отказываться грузить такой файл и выдавать что с чем пересеклось, либо не отказываться и корректно работать в таких условиях.&lt;br /&gt;&lt;br /&gt;Файл грузится один раз и потом десятки миллионов раз лукапится. Записей в конфиге - сотни.&lt;/cite&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Решение:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# cat &amp;gt; z.pl
#! /usr/bin/perl

use Net::Patricia;
use Net::CIDR::Lite;

my $pt = new Net::Patricia;
my $cidr = new Net::CIDR::Lite;

open F, shift or die;
while (&lt;f&gt;) {
        chomp; s#,#-#;
        foreach my $m ($cidr-&amp;gt;add_range($_)-&amp;gt;list) { $pt-&amp;gt;add_string($m) }
}

foreach (&amp;lt;&amp;gt;) {
        chomp;
        print $_, &quot;:&quot;, $pt-&amp;gt;match_string($_) ? &quot;YES&quot; : &quot;NO&quot;, &quot;\n&quot;;
}
^D
# perl z.pl /tmp/ip.range =( print -l 192.168.1.1 192.168.1.4 )
192.168.1.1:NO
192.168.1.4:YES
# perl -le &apos;foreach (0..$ARGV[0]) { printf &quot;%d.%d.%d.%d\n&quot;, rand()%255, rand()%255, rand()%255, rand()%255 }&apos; 10240000 &amp;gt;| /tmp/ip.list
# wc -l /tmp/ip.list
10240001 /tmp/ip.list
# time perl z.pl /tmp/ip.range /tmp/ip.list &amp;gt;| /dev/null
Real: 120.10s User: 105.21s System: 1.31s Percent: 88%% Cmd: perl z.pl /tmp/ip.range /tmp/ip.list &amp;gt;| /dev/null
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PS. Вкралась ошибка: неправильно сгенерил список ip адресов, надо&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# perl -le &apos;foreach (0..$ARGV[0]) { printf &quot;%d.%d.%d.%d\n&quot;, int(rand(255)), int(rand(255)), int(rand(255)), int(rand(255)) }&apos; 10240000 &amp;gt;| /tmp/ip.list&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Результат:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# time perl z.pl /tmp/ip.range /tmp/ip.list &amp;gt;| /dev/null
Real: 176.98s User: 153.23s System: 2.20s Percent: 87%% Cmd: perl z.pl /tmp/ip.range /tmp/ip.list &amp;gt;| /dev/null&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;PS2. Скорость слабо зависит от количества сетей:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# for i in {1..300}; do a=$[ $RANDOM%255 ]; b=$[ $RANDOM%255 ]; c=$[ $RANDOM%254 ]; d=$[ $RANDOM%254 ]; print &quot;$a.$b.$c.$d,$a.$b.$[$c+1].$[$d+1]&quot;; done &amp;gt;| /tmp/ip.range2
# time perl z.pl /tmp/ip.range2 /tmp/ip.list &amp;gt;| /dev/null
Real: 187.54s User: 173.13s System: 1.98s Percent: 93%% Cmd: perl z.pl /tmp/ip.range2 /tmp/ip.list &amp;gt;| /dev/null
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/53891.html</comments>
  <category>perl</category>
  <category>unix</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/53595.html</guid>
  <pubDate>Thu, 17 Nov 2011 05:59:25 GMT</pubDate>
  <title>Версия пакета в package.</title>
  <link>http://ocehb.livejournal.com/53595.html</link>
  <description>Можно теперь писать так:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
package Package 1.23;
...
print $VERSION, &quot;\n&quot;;
...
1;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Но версия в таком операторе не вычисляется, там надо писать именно число.&lt;br /&gt;Т.е. такое выражение даст ошибку:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
package Package qw$Revision: 1.23 $[1];
&lt;/code&gt;&lt;/pre&gt;</description>
  <comments>http://ocehb.livejournal.com/53595.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/53473.html</guid>
  <pubDate>Thu, 20 Oct 2011 13:42:30 GMT</pubDate>
  <title>разбор ini-файла</title>
  <link>http://ocehb.livejournal.com/53473.html</link>
  <description>Простейший ini-файл:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;
# Comment
Param1 = Value1

[Section1]

Param2 = Value2
LongParam = Very \
                         Long \
                         Param

[Section2]
Param3 = Value3
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;
# perl -MData::Dumper -0777 -lne &apos;s#\#.*?\n##gm; s#\\\n\s+##gsm; my $sect = &quot;__DEFAULT__&quot;;
   while (m#(?:(?&lt;name&gt;\w+)\s*=\s*(?&lt;value&gt;.+?)\s+$|\[(?&lt;sect&gt;\w+)\])#gm) {
     $sect = $+{sect} || $sect; $hash{$sect}-&amp;gt;{$+{name}} = $+{value} if exists $+{name}
   } print Dumper \%hash&apos; /tmp/a.ini
$VAR1 = {
          &apos;Section1&apos; =&amp;gt; {
                          &apos;LongParam&apos; =&amp;gt; &apos;Very Long Param&apos;
                        },
          &apos;Section2&apos; =&amp;gt; {
                          &apos;Param3&apos; =&amp;gt; &apos;Value3&apos;
                        },
          &apos;__DEFAULT__&apos; =&amp;gt; {
                             &apos;Param1&apos; =&amp;gt; &apos;Value1&apos;
                           }
        };
#
&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Или в виде функции:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;
sub ini ($) {
  local $_ = do { local $/; open F, $_[0] and &lt;f&gt; };
  s#\#.*?\n##gm; s#\\\n\s+##gsm;
  my $sect = &quot;__DEFAULT__&quot;; 
  my %hash;
  while (m#(?:(?&lt;name&gt;\w+)\s*=\s*(?&lt;value&gt;.+?)\s+$|\[(?&lt;sect&gt;\w+)\])#gm) {
    $sect = $+{sect} || $sect;
    $hash{$sect}-&amp;gt;{$+{name}} = $+{value} if exists $+{name}
  }
  return \%hash;
}
&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/53473.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/53138.html</guid>
  <pubDate>Wed, 31 Aug 2011 08:56:24 GMT</pubDate>
  <title>Различие .. и ... в perl</title>
  <link>http://ocehb.livejournal.com/53138.html</link>
  <description>&lt;pre&gt;&lt;code&gt;
zsh# print -l &quot;AA BB&quot; &quot;test&quot; &quot;BB&quot; | perl -lne &apos;print if (/AA/ .. /BB/)&apos;
AA BB
zsh# print -l &quot;AA BB&quot; &quot;test&quot; &quot;BB&quot; | perl -lne &apos;print if (/AA/ ... /BB/)&apos;
AA BB
test
BB
zsh#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;разница только во времени вычисления правой части.&lt;br /&gt;&lt;br /&gt;perldoc perlop: &lt;cite&gt;If you don&apos;t want it to test the right operand until the next evaluation, as in sed, just use three dots (&quot;...&quot;) instead of two.  In all other regards, &quot;...&quot; behaves just like &quot;..&quot; does.&lt;/cite&gt;</description>
  <comments>http://ocehb.livejournal.com/53138.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/52767.html</guid>
  <pubDate>Thu, 25 Aug 2011 14:14:23 GMT</pubDate>
  <title>killapache</title>
  <link>http://ocehb.livejournal.com/52767.html</link>
  <description>&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# grep killapache /etc/httpd/modsecurity.d/modsecurity_localrules.conf
SecRule REQUEST_HEADERS:Range &quot;@rx bytes=.+?,.+?,&quot; &quot;drop,log,noauditlog,msg:&apos;killapache range attack&apos;,status:417&quot;
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;как работает -- дропает соединение, если в заголовке больше чем два диапазона.&lt;br /&gt;&lt;br /&gt;да, mod_security полезный модуль :)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/images/apache-ii.jpg&quot; /&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/52767.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/52546.html</guid>
  <pubDate>Tue, 09 Aug 2011 11:43:03 GMT</pubDate>
  <link>http://ocehb.livejournal.com/52546.html</link>
  <description>программка, &lt;cite&gt;которая просит ввести числа в массив, а когда вводится пустая строка, спрашивает имя файла и записывает в него этот массив&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;однострочник:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# perl -lne &apos;$_ ? push @a, $_ : do { print &quot;File? &quot;; $_=&amp;lt;&amp;gt;; chomp; open F, &quot;&amp;gt;&quot;, $_ and print F &quot;@a&quot;; exit }&apos;
1
2
3

File? 
AA
# cat AA
1 2 3
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;интересно, можно короче?&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/52546.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/52256.html</guid>
  <pubDate>Mon, 08 Aug 2011 05:56:02 GMT</pubDate>
  <title>-F</title>
  <link>http://ocehb.livejournal.com/52256.html</link>
  <description>Есть файл типа&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
ERD_Sovetsk_22 Power: OK
ERD_Lenina_31 Power: PROBLEM
ERD_Svobody_1 Power: OK
Kommynist_33 is access: PROBLEM
ERD_Sovetsk_100 Power: PROBLEM
ERD_Partizan_98 Power: PROBLEM
Marksa_4 is access: PROBLEM
Revolucii_67 is access: PROBLEM
Marksa_4 is access: PROBLEM
Revolucii_67 is access: OK
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Раскидать значения по статусу.&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;однострочник:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# perl -aF&quot;:\\s+&quot; -lne &apos;push @{$a{$F[1]}}, $F[0];
  END{ print STDERR &quot;PROBLEM: &quot;, join &quot;,&quot;, @{$a{PROBLEM}};
       print &quot;OK: &quot;, join &quot;,&quot;, @{$a{OK}}; }&apos; file
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;основную работу делает &lt;code&gt;-aF&quot;:\\s+&quot;&lt;/code&gt; и &lt;code&gt;push&lt;/code&gt;, которые делят входящие строки и распихивают их по статусу в &lt;code&gt;%a&lt;/code&gt;.&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/images/letter-f.gif&quot; width=&quot;150&quot; /&gt; :)</description>
  <comments>http://ocehb.livejournal.com/52256.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/52089.html</guid>
  <pubDate>Mon, 01 Aug 2011 13:36:41 GMT</pubDate>
  <title>Получение первых N байт по http</title>
  <link>http://ocehb.livejournal.com/52089.html</link>
  <description>&lt;pre&gt;&lt;code&gt;
#! perl

use LWP::UserAgent
use Try::Tiny

my $chunk;
try { new LWP::UserAgent()-&amp;gt;get ($url, &apos;:content_cb&apos; =&amp;gt; sub { $chunk = $_[0]; die },
                                       &apos;:read_size_hint&apos; =&amp;gt; 32); };
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;однострочник.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# perl -MLWP::UserAgent -le &apos;try { new LWP::UserAgent()-&amp;gt;get ($ARGV[0], \
  &apos;&apos;:content_cb&apos;&apos; =&amp;gt; sub { print  $_[0]; exit }, &apos;&apos;:read_size_hint&apos;&apos; =&amp;gt; $ARGV[1]); }&apos; \
  http://www.google.fi/images/srpr/logo2w.png 32 | file -
/dev/stdin: PNG image data, 275 x 95, 8-bit colormap, non-interlaced
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/52089.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/51745.html</guid>
  <pubDate>Thu, 23 Jun 2011 12:55:26 GMT</pubDate>
  <title>&quot;Поиск и замена текста на новый во многих файлах в unix&quot;</title>
  <link>http://ocehb.livejournal.com/51745.html</link>
  <description>&lt;a href=&quot;http://teerex.intome.ru/blog/%D0%BF%D0%BE%D0%B8%D1%81%D0%BA-%D0%B8-%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0-%D0%BD%D0%B0-%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9-%D0%B2%D0%BE-%D0%BC%D0%BD%D0%BE%D0%B3%D0%B8%D1%85-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D1%85-%D0%B2-unix&quot; rel=&quot;nofollow&quot;&gt;отсюда&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;Команда найдёт все файлы в текущем каталоге и подкаталогах, содержащие OLD_TEXT и заменит строку &quot;OLD_TEXT&quot; на &quot;NEW_TEXT&quot;:&lt;br /&gt;grep -HR OLDTEXT ./ | awk &apos;{print $1}&apos; | sed &apos;s/:.*$//&apos; | grep -v &apos;~&apos; | sort | uniq | xargs perl -i -pe &quot;s/OLD_TEXT/NEW_TEXT/g;&quot;&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;мне кажется, что ужасно. мое решение:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
grep -rl OLDTEXT . | xargs perl -i -pe &quot;s/OLD_TEXT/NEW_TEXT/g;&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;если хочется убрать ненужные файлы, то вставить grep -Ev &apos;(~|.o|.a)$&apos;, по вкусу.&lt;br /&gt;&lt;br /&gt;ps. а &lt;code&gt;sed &apos;s/:.*$//&apos;&lt;/code&gt; эффективно прибъёт файлы с двоеточием в имени.&lt;br /&gt;&lt;br /&gt;pps. gnu grep умеет -Z</description>
  <comments>http://ocehb.livejournal.com/51745.html</comments>
  <category>shell</category>
  <lj:security>public</lj:security>
  <lj:reply-count>10</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/51469.html</guid>
  <pubDate>Sun, 05 Jun 2011 10:01:28 GMT</pubDate>
  <title>:)</title>
  <link>http://ocehb.livejournal.com/51469.html</link>
  <description>&lt;pre&gt;&lt;cite&gt;Очень нужен perl программист под catalyst framework

Плачу нефтью&lt;/cite&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;noindex&gt;&lt;a href=&quot;http://yvision.kz/community/Web-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0/164990.html&quot; rel=&quot;nofollow&quot;&gt;отсюда&lt;/a&gt;&lt;/noindex&gt;</description>
  <comments>http://ocehb.livejournal.com/51469.html</comments>
  <category>perl</category>
  <category>humor</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/51391.html</guid>
  <pubDate>Fri, 20 May 2011 13:28:39 GMT</pubDate>
  <title>Дожили :)</title>
  <link>http://ocehb.livejournal.com/51391.html</link>
  <description>&lt;pre&gt;&lt;code&gt;
20.05.11
Переобучим с PHP на Perl.
-----
Испытываем дефицит в perl-программистах, если Вы пишете на PHP и желаете выучить
Perl - обучим, дадим проекты на удаленку.
Больше предпочтений Москвичам, в силу возможности обучения при личном присутствии.
http://www.***.ru/***732592
&lt;/code&gt;&lt;/pre&gt;</description>
  <comments>http://ocehb.livejournal.com/51391.html</comments>
  <category>perl</category>
  <category>humor</category>
  <lj:security>public</lj:security>
  <lj:reply-count>28</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/51062.html</guid>
  <pubDate>Thu, 28 Apr 2011 05:50:47 GMT</pubDate>
  <title>маленькая задачка</title>
  <link>http://ocehb.livejournal.com/51062.html</link>
  <description>&lt;cite&gt;Есть текстовый файл. Сформировать массив, хранящий номера строк файла, в которых будет встречаться слово &quot;мель&quot;; в тексте удалить все комментарии, т.е. текст, заключенный между /* и */, включая эти символы.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;Решение:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# perl -0777 -lne &apos;sub fun ($) { local $_ = $_[0]; s#[^\n]+##gsm; return $_; } 
                   s#/\*.*?\*/#fun($&amp;)#gsme;
                   foreach (split &quot;\n&quot;) { $n++; m#мель# &amp;&amp; print $n,&quot;\n&quot; }&apos; file
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/51062.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/50874.html</guid>
  <pubDate>Wed, 30 Mar 2011 19:06:13 GMT</pubDate>
  <title>PerlBloat</title>
  <link>http://ocehb.livejournal.com/50874.html</link>
  <description>&lt;pre&gt;&lt;code&gt;
# locate -r &quot;\\.3pm\$&quot; | grep -F &quot;/man/man3&quot; | \
  sed -e &quot;s#^.\\+/##&quot; -e &quot;s#\\.3pm\$##&quot; | \
  xargs -n1 &lt;a href=&quot;http://arto.homeunix.org/perlbloat&quot; rel=&quot;nofollow&quot;&gt;perlbloat&lt;/a&gt; 2&amp;gt; /dev/null | sort -h -t&quot; &quot; -k3 -r | head -10
Catalyst::Script::Server added 13.3M
Catalyst::Plugin::Session::Test::Store added 13.3M
Catalyst added 12.1M
Catalyst::View::Email::Template added 12.0M
Catalyst::Script::Test added 12.0M
Catalyst::View::Email added 11.9M
Apache::TestMB added 11.9M
DBIx::Class::Storage::DBI::Replicated added 11.4M
AnyEvent::Impl::Perl added 1020k
DBIx::Class::SQLMaker::LimitDialects added 1012k
&lt;/code&gt;&lt;/pre&gt;</description>
  <comments>http://ocehb.livejournal.com/50874.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/50555.html</guid>
  <pubDate>Tue, 15 Mar 2011 11:58:33 GMT</pubDate>
  <title>сравнение скорости регулярного выражения и поиска в хеше</title>
  <link>http://ocehb.livejournal.com/50555.html</link>
  <description>используем конструкцию (??{ code }); perldoc perlre&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# for i in {1..10}; do print &quot;Size: $[ 2**$i ]&quot;;
  perl -MBenchmark=timethese -e &apos;$N = int ($ARGV[0]/2);
    @a = map { int rand(1024000) } 0..$ARGV[0];
    @hash{@a} = (1)x($#a+1);
    $re = join &quot;|&quot;,keys %hash;
    timethese ($ARGV[1],
      { A =&amp;gt; sub { return $a[$N] =~ m#^(\w+)(??{ exists $hash{$1} ? &quot;&quot; : &quot;N/A&quot; })$# },
        B =&amp;gt; sub { return $a[$N] =~ m#^$re$# } } )&apos; $[ 2**$i ] 1000000; done
Size: 2
Benchmark: timing 1000000 iterations of A, B...
         A:  3 wallclock secs ( 4.53 usr +  0.02 sys =  4.55 CPU) @ 219780.22/s (n=1000000)
         B:  0 wallclock secs ( 0.63 usr +  0.00 sys =  0.63 CPU) @ 1587301.59/s (n=1000000)
Size: 4
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.54 usr +  0.00 sys =  4.54 CPU) @ 220264.32/s (n=1000000)
         B:  2 wallclock secs ( 1.10 usr +  0.00 sys =  1.10 CPU) @ 909090.91/s (n=1000000)
Size: 8
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.49 usr +  0.02 sys =  4.51 CPU) @ 221729.49/s (n=1000000)
         B:  2 wallclock secs ( 1.16 usr +  0.02 sys =  1.18 CPU) @ 847457.63/s (n=1000000)
Size: 16
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.86 usr +  0.01 sys =  4.87 CPU) @ 205338.81/s (n=1000000)
         B:  2 wallclock secs ( 1.24 usr +  0.00 sys =  1.24 CPU) @ 806451.61/s (n=1000000)
Size: 32
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.53 usr +  0.01 sys =  4.54 CPU) @ 220264.32/s (n=1000000)
         B:  2 wallclock secs ( 1.44 usr +  0.00 sys =  1.44 CPU) @ 694444.44/s (n=1000000)
Size: 64
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.53 usr + -0.01 sys =  4.52 CPU) @ 221238.94/s (n=1000000)
         B:  1 wallclock secs ( 1.76 usr +  0.01 sys =  1.77 CPU) @ 564971.75/s (n=1000000)
Size: 128
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.45 usr +  0.03 sys =  4.48 CPU) @ 223214.29/s (n=1000000)
         B:  3 wallclock secs ( 2.45 usr +  0.00 sys =  2.45 CPU) @ 408163.27/s (n=1000000)
Size: 256
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.54 usr +  0.01 sys =  4.55 CPU) @ 219780.22/s (n=1000000)
         B:  5 wallclock secs ( 3.88 usr +  0.02 sys =  3.90 CPU) @ 256410.26/s (n=1000000)
Size: 512
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.50 usr +  0.02 sys =  4.52 CPU) @ 221238.94/s (n=1000000)
         B:  7 wallclock secs ( 6.64 usr +  0.01 sys =  6.65 CPU) @ 150375.94/s (n=1000000)
Size: 1024
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.56 usr + -0.01 sys =  4.55 CPU) @ 219780.22/s (n=1000000)
         B: 13 wallclock secs (12.27 usr +  0.04 sys = 12.31 CPU) @ 81234.77/s (n=1000000)
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/cgi/track.pl?20110315&quot; /&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;резюме: на &lt;b&gt;больших&lt;/b&gt; массивах имеет смысл использовать поиск через хеш.&lt;br /&gt;&lt;br /&gt;update: при модификаторе /о регулярное выражение выигрывает у хеша, но до определенного размера.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
Size: 16384
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.58 usr + -0.01 sys =  4.57 CPU) @ 218818.38/s (n=1000000)
         B:  0 wallclock secs ( 0.90 usr +  0.02 sys =  0.92 CPU) @ 1086956.52/s (n=1000000)
Size: 32768
Benchmark: timing 1000000 iterations of A, B...
         A:  5 wallclock secs ( 4.55 usr +  0.00 sys =  4.55 CPU) @ 219780.22/s (n=1000000)
         B: 239 wallclock secs (237.26 usr +  0.37 sys = 237.63 CPU) @ 4208.22/s (n=1000000)
&lt;/code&gt;&lt;/pre&gt;</description>
  <comments>http://ocehb.livejournal.com/50555.html</comments>
  <category>perl regexp</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/50398.html</guid>
  <pubDate>Mon, 28 Feb 2011 16:21:50 GMT</pubDate>
  <title>маленькая задачка</title>
  <link>http://ocehb.livejournal.com/50398.html</link>
  <description>&lt;cite&gt;&lt;br /&gt;Необходимо прочитать 30-Мб файл в переменную и сделать в переменной мультистрочный поиск...&lt;br /&gt;хочу поймать такие строки:&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
!КОМАНДА
текст текст текст текст текст текст текст текст текст текст текст текст

&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;cite&gt;Т.е. если строка начинается на &quot;!&quot;, то нужно печатать все до тех пор, пока не будет полностью пустая строка (^\s*$).&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;мое решение:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
perl -0000 -lne &apos;m#^(!.+)#sm &amp;&amp; print $1&apos;
&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;т.е. читаем по-параграфно, находим &lt;code&gt;^!&lt;/code&gt; и выбираем от него и до конца.&lt;br /&gt;&lt;br /&gt;ps. есть возможность споткнуться о &quot;пустую строку&quot;, где буд(е|у)т пробел(ы).&lt;br /&gt;&lt;br /&gt;pps.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# ll -h /var/log/messages-20110213 
-rw-------. 1 root root 190M Feb 13 03:12 /var/log/messages-20110213
# perl -lne &apos;print; print &quot;\n&quot; if (int(rand 100)%5 == 0); &apos; /var/log/messages-20110213 &amp;gt;| /tmp/test
# ll -h /tmp/test
-rw-r--r--. 1 ocehb wheel 190M Feb 28 16:15 /tmp/test
# time perl -0000 -lne &apos;m#^(!.+)#sm &amp;&amp; print $1&apos; /tmp/test
Real: 1.14s User: 0.18s System: 0.91s Percent: 95%% Cmd: perl -0000 -lne &apos;m#^(!.+)#sm &amp;&amp; print $1&apos; /tmp/test
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/cgi/track.pl?20110228&quot; /&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/50398.html</comments>
  <category>perl</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/49942.html</guid>
  <pubDate>Fri, 25 Feb 2011 16:06:52 GMT</pubDate>
  <title>опять задача на перестановки :)</title>
  <link>http://ocehb.livejournal.com/49942.html</link>
  <description>phpшников ищут:&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;Отбор кандидатов будет включать: выполнение теста на знания, решение двух тестовых задач и личное собеседование. Очень сильно поднимаются Ваши шансы, если пришлете алгоритм словами и php-код решения (или нескольких решений) следующей задачи:&lt;br /&gt;&lt;br /&gt;Сделать, чтобы для строки&lt;br /&gt;&quot;{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.&quot;&lt;br /&gt;выдавались все возможные варианты (вложенность не ограничена).&lt;br /&gt;&lt;br /&gt;Например, строка &quot;{a|b|c}&quot; порождает три варианта: «a», «b» или «c».&lt;br /&gt;А &quot;{a | b {c|d}}&quot; дает: «a», «b c» и «b d».&lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name=&quot;cutid1&quot;&gt;&lt;/a&gt;&lt;br /&gt;мое решение:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# print &quot;{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.&quot; | \
  perl -lne &apos;s#,#\##g; s#\|#,#g; s#\s#_#g; foreach (glob) { s#_# #g; s#\##,#g; print }&apos;
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это крутое тестовое предложение менялось каждый раз.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Пожалуйста сделайте так, чтобы это простое тестовое предложение изменялось мгновенно случайным образом.
Пожалуйста сделайте так, чтобы это простое тестовое предложение менялось каждый раз.
Просто сделайте так, чтобы это удивительное тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение изменялось мгновенно случайным образом.
Просто сделайте так, чтобы это удивительное тестовое предложение менялось каждый раз.
Просто сделайте так, чтобы это крутое тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это крутое тестовое предложение изменялось мгновенно случайным образом.
Просто сделайте так, чтобы это крутое тестовое предложение менялось каждый раз.
Просто сделайте так, чтобы это простое тестовое предложение изменялось быстро случайным образом.
Просто сделайте так, чтобы это простое тестовое предложение изменялось мгновенно случайным образом.
Просто сделайте так, чтобы это простое тестовое предложение менялось каждый раз.
#
&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;шутка :)&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/cgi/track.pl?20110225&quot; /&gt;&lt;br /&gt;&lt;a name=&apos;cutid1-end&apos;&gt;&lt;/a&gt;</description>
  <comments>http://ocehb.livejournal.com/49942.html</comments>
  <category>perl</category>
  <category>humor</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/49667.html</guid>
  <pubDate>Thu, 24 Feb 2011 10:03:54 GMT</pubDate>
  <link>http://ocehb.livejournal.com/49667.html</link>
  <description>ищут работника для&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;&lt;br /&gt;Написание кандидатской работы – Информационная безопасность&lt;br /&gt;Требуется специалист для написания кандидатской работы и научных статей по информационной безопасности.  Тематика кандидатской работы: анализ защищенности компьютерной сети методом построения графа атак. &lt;br /&gt;&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;интересно, какой смысле защищаться, если не владеешь материалом&lt;br /&gt;и по специальности работать не будешь?&lt;br /&gt;&lt;br /&gt;имхо проще прикупить mba...&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://arto.homeunix.org/images/zashita-doktorskoi.jpg&quot; /&gt;</description>
  <comments>http://ocehb.livejournal.com/49667.html</comments>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>http://ocehb.livejournal.com/49624.html</guid>
  <pubDate>Sun, 12 Dec 2010 15:03:50 GMT</pubDate>
  <title>нестандартное использование флага -s в install</title>
  <link>http://ocehb.livejournal.com/49624.html</link>
  <description>Если после инсталляции через команду &lt;code&gt;install&lt;/code&gt; надо произвести какие-либо действия,&lt;br /&gt;то можно их активировать через флаг(и) &lt;code&gt;-s&lt;/code&gt; (&lt;code&gt;—strip&lt;/code&gt; и &lt;code&gt;—strip-program&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;Например надо перекодировать файл из koi8-r в utf8:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;
# cat &amp;gt; encode.sh
#! /bin/sh -f
iconv -c -f koi8-r -t utf8 $1 /tmp/tmp.$$
mv -f /tmp/tmp.$$ $1
^D
# chmod +x encode.sh
# install —strip —strip-program=./encode.sh file /install/path/file
&lt;/code&gt;&lt;/pre&gt;</description>
  <comments>http://ocehb.livejournal.com/49624.html</comments>
  <category>shell</category>
  <category>unix</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
</channel>
</rss>

