<?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:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ky6uk&#039;s Blog &#187; Perl 6</title>
	<atom:link href="http://ky6uk.org/tag/perl-6/feed" rel="self" type="application/rss+xml" />
	<link>http://ky6uk.org</link>
	<description>Очередной прыщебложик... :3</description>
	<lastBuildDate>Wed, 02 Nov 2011 20:49:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>День 8: расчесываем ограничения</title>
		<link>http://ky6uk.org/den-8-raschesyvaem-ogranicheniya?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-8-raschesyvaem-ogranicheniya</link>
		<comments>http://ky6uk.org/den-8-raschesyvaem-ogranicheniya#comments</comments>
		<pubDate>Sat, 19 Jun 2010 18:41:14 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=712</guid>
		<description><![CDATA[Перевод на русский язык восьмой статьи цикла Perl 6 Advent Calendar. Мы попали в точку, где предыдущие подарки будут полезны для нынешних. Сегодня у нас двойной набор: метод comb (расческа) и идея ограничений. Аналогично статичным типам предыдущих определений, ограничения позволяют качественнее управлять написанием подпрограмм и методов. Во многих других языках программирования вы должны передавать параметры в [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод на русский язык восьмой статьи цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a>.<br />
<span id="more-712"></span><br />
Мы попали в точку, где предыдущие подарки будут полезны для нынешних. Сегодня у нас двойной набор: метод <em>comb</em> (расческа) и идея ограничений.</p>
<p>Аналогично статичным типам предыдущих определений, ограничения позволяют качественнее управлять написанием подпрограмм и методов. Во многих других языках программирования вы должны передавать параметры в подпрограмму, а затем проверять введенные данные. С ограничениями вы можете проверять правильность непосредственно в объявлении.</p>
<p>Возьмем простой пример. Если целое число четное, то я не хочу иметь дела с этой подпрограммой. В Perl 5 вы бы написали что-то похожее на это:</p>
<pre class="brush: perl; title: ; notranslate">sub very_odd
{
    my $odd = shift;
    unless ($odd % 2)
    {
        return undef;
    }
    # Process the odd number here.
}</pre>
<p>В Perl 6 это может быть упрощено:</p>
<pre class="brush: perl; title: ; notranslate">sub very_odd(Int $odd where {$odd % 2})
{
    # Process the odd number here
}</pre>
<p>При попытке вызова <em>very_odd</em> с четным числом вы получите сообщение об ошибке. Не волнуйтесь, хотя вы можете использовать возможности мультифункций чтобы дать даже числам возможность проявить себя&#8230; может быть. ;)</p>
<pre class="brush: perl; title: ; notranslate">multi sub very_odd(Int $odd where {$odd % 2})
{
    # Process the odd number here
}
multi sub very_odd(Int $odd) { return Bool::False; }</pre>
<p>Эти ограничения могут быть полезны при сочетании с методом <em>.comb</em>. Что же такое <em>.comb</em>? Для тех, кто расчесывает свои волосы: вы обычно пользуетесь расческой, чтобы уложить отдельные волоски. Для тех, кто любит использовать <em>.split</em> все как раз наоборот. Этот простой фрагмент кода должен продемонстрировать как работает <em>.comb</em>:</p>
<pre class="brush: perl; title: ; notranslate">say &quot;Perl 6 Advent&quot;.comb(/&lt;alpha&gt;/).join('|');
say &quot;Perl 6 Advent&quot;.comb(/&lt;alpha&gt;+/).join('|');</pre>
<p>Регулярные выражения, скорее всего, будут открыты в другой день, но быстрый взгляд не будет болезненным. Первая строка будет выводить &#171;P|e|r|l|A|d|v|e|n|t&#187;: берется каждый буквенный символ и помещается во временный массив. Затем он соединяется с символом вертикальной черты. Вторая строка аналогична, только она захватывает столько букв, сколько сможет, отсюда результат &#171;Perl|Advent&#187;.</p>
<p>Однако, сила <em>.comb</em> намного больше. После того как вы &#171;расчесали&#187; что хотели, вы можете управлять &#171;волосками&#187;. Если у вас есть определенный набор шестнадцатеричных ASCII символов, вы можете использовать гипероператоры для преобразования каждого кусочка в ASCII эквивалент!</p>
<pre class="brush: perl; title: ; notranslate">say &quot;5065726C36&quot;.comb(/&lt;xdigit&gt;**2/)».fmt(&quot;0x%s&quot;)».chr
# Outputs &quot;Perl6&quot;</pre>
<p>Помните, это Perl. Существует много способов сделать это. ☺</p>
<p>Со всеми подарками, что были представлены сегодня, я дам вам задачу. С помощью Kayl Hasselbacher, я смог сделать достойную версию древнего шифра Цезаря при помощи ограничений, <em>.comb</em>, и старого доброго <em>.map</em>:</p>
<pre class="brush: perl; title: ; notranslate">use v6;

sub rotate_one( Str $c where { $c.chars == 1 }, Int $n ) {
    return $c if $c !~~ /&lt;alpha&gt;/;
    my $out = $c.ord + $n;
    $out -= 26 if $out &gt; ($c eq $c.uc ?? 'Z'.ord !! 'z'.ord);
    return $out.chr;
}

sub rotate(Str $s where {$s.chars}, Int $n = 3)
{
    return ($s.comb.map: { rotate_one( $_, $n % 26 ) }).join( '' );
}

die &quot;Usage:\n$*PROGRAM_NAME string number_for_rotations&quot; unless @*ARGS == 2;

my Str $mess = @*ARGS[0];
my Int $rotate = @*ARGS[1].Int;

say qq|&quot;$mess&quot; rotated $rotate characters gives &quot;{rotate($mess,$rotate)}&quot;.|;</pre>
<p>Я хотел бы посмотреть как остальные смогут реализовать код этого алгоритма используя Perl 6 и уже открытые подарки. В конце концов язык может получиться только лучше и удобнее.</p>
<p>© <a href="http://perl6advent.wordpress.com/2009/12/08/day-8-comb-your-constraints/">Оригинальная статья.</a></p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li><li><a href="http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii" title="День 3: статические типы и мульти-функции">День 3: статические типы и мульти-функции</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-8-raschesyvaem-ogranicheniya/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>День 7: Циклы для пользы и развлечения</title>
		<link>http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-7-cikly-dlya-polzy-i-razvlecheniya</link>
		<comments>http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya#comments</comments>
		<pubDate>Fri, 30 Apr 2010 08:44:43 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=488</guid>
		<description><![CDATA[Перевод на русский язык седьмой статьи цикла Perl 6 Advent Calendar. Любой программист, когда-либо использовавший язык, наверняка знает, что циклы чрезвычайно полезны. В языках, которые предоставляют их, очень часто используют циклы foreach для выполнения итерации массивов или списков. В Perl 5 эти циклы были представлены ключевым словом foreach, хотя, так же можно было писать for, [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод на русский язык седьмой статьи цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a>.<br />
<span id="more-488"></span><br />
Любой программист, когда-либо использовавший язык, наверняка знает, что циклы чрезвычайно полезны. В языках, которые предоставляют их, очень часто используют циклы <em>foreach</em> для выполнения итерации массивов или списков. В Perl 5 эти циклы были представлены ключевым словом <em>foreach</em>, хотя, так же можно было писать <em>for</em>, для большей схожестью с C-подобными циклами.</p>
<p>В Perl 6 все изменилось.</p>
<p>В настоящее время для итерации по спискам используется исключительно <em>for</em>. <em>foreach</em> исчез, а C-подобные циклы обрабатываются новым ключевым словом <em>loop</em>. Сегодня мы не будем это обсуждать, но мы собираемся сосредоточиться на новом цикле <em>for</em>, который в сочетании с другими языковыми особенностями Perl 6 предоставляет чрезвычайно гибкую и мощную конструкцию.</p>
<p>Давайте рассмотрим обычный случай.</p>
<pre class="brush: perl; title: ; notranslate">for 1, 2, 3, 4 { .say }</pre>
<p>Здесь сразу заметны некоторые вещи в синтакисе. Нет скобок списка конструкций, которые распространяются на весь Perl 6. В общем, требуется много меньше скобок чем в Perl 5. Так же как и в Perl 5, по умолчанию переменная цикла <em>$_</em>. Вызов метода <em>say</em> без какого-либо применения, так же как и <em>$_.say</em>. Обратите внимание, что в Perl 6 по умолчанию мы не можем вызвать <em>say</em> без аргумента для <em>$_</em>, мы должны использовать <em>.say</em> либо явно указать <em>$_</em> в качестве аргумента.</p>
<p>Блок не должен быть обычным блоком. Это может быть острый блок (<em>-&gt;</em>), который позволяет нам передавать параметр из цикла в переменную.</p>
<pre class="brush: perl; title: ; notranslate">for 1, 2, 3, 4 -&gt; $i { $i.say }</pre>
<p>Острый блок похож на анонимную подпрограмму, за исключением того, что не ловит значения <em>return</em>. Если мы вызовем <em>return</em> внутри острого блока, будет возвращено enclosing routine.</p>
<p>Острый блок может принимать больше одного параметра из списка. Что произойдет если мы это сделаем?</p>
<pre class="brush: perl; title: ; notranslate">for 1, 2, 3, 4 -&gt; $i, $j { &quot;$i, $j&quot;.say }</pre>
<p>Теперь, если мы запустим это, то получим:</p>
<pre class="brush: plain; title: ; notranslate">1 2
3 4</pre>
<p>То, что произошло, является итерацией по два элемента из списка. Это работает для любого числа параметров с одним минимальным, который вырождается в использование <em>$_</em> если мы явно не укажем свой параметр.</p>
<p>Поняв как это работает, что мы можем сделать с перебором списков? Ну конечно же мы можем использовать переменную массива:</p>
<pre class="brush: perl; title: ; notranslate">for @array { .say }</pre>
<p>Хотя во многих простых случаях лучше использовать <em>map</em>:</p>
<pre class="brush: perl; title: ; notranslate">@array.map: *.say;</pre>
<p>Или гипероператор, если порядок и последовательность не имеют значения:</p>
<pre class="brush: perl; title: ; notranslate">@array».say;</pre>
<p>Но ни одна из этих вещей не является сегодня объектом обсуждения.</p>
<p>Мы можем создать список номеров с помощью конструктора диапазона &#171;<em>..</em>&#171;:</p>
<pre class="brush: perl; title: ; notranslate">for 1..4 { .say }</pre>
<p>Зачастую мы хотим создать список из <em>$n</em> чисел начиная с нуля, таких как индекс массива. Мы могли бы написать <em>0..$n-1</em> или использовать вариант конструктора диапазона <em>0..^$n</em>, но Perl 6 предоставляет  удобный инструмент в форме &#171;<em>^</em>&#171;:</p>
<pre class="brush: perl; title: ; notranslate">for ^4 { .say }</pre>
<p>Который выведет:</p>
<pre class="brush: plain; title: ; notranslate">0
1
2
3</pre>
<p>Одной из причин, по которой люди часто ссылаются на C-подобный стиль циклов в Perl 5 является необходимость знать что индекс в массиве они находят для каждого элемента, или необходимость перебирать два или больше массивов параллельно. Perl 6 предлагает для этих целей оператор <em>Z</em> (zip-оператор, оператор &#171;застёжка&#187;).</p>
<pre class="brush: perl; title: ; notranslate">for @array1 Z @array2 -&gt; $one, $two { ... }</pre>
<p>Предполагая, что два массива одинаковой длины, в <em>$one</em> будет каждый элемент массива <em>@array1</em> и в <em>$two</em> будет соответствующий элемент массива <em>@array2</em>. Если они различной длины, то итерация будет остановлена на последнем элементе самого короткого массива.</p>
<p>Зная это, и зная то, что в Perl 6 есть &#171;ленивые&#187; списки генераторов, мы можем легко включить индекс массива в итерацию:</p>
<pre class="brush: perl; title: ; notranslate">for ^Inf Z @array -&gt; $index, $item { ... }</pre>
<p>Хотя, если бесконечные списки нервируют вас,</p>
<pre class="brush: perl; title: ; notranslate">for ^@array.elems Z @array -&gt; $index, $item { ... }</pre>
<p>даст вам тот же результат, но, возможно, самое элегантное представление:</p>
<pre class="brush: perl; title: ; notranslate">for @array.kv -&gt; $index, $item { ... }</pre>
<p><em>@array.kv</em> возвращает ключи и значения попарно, где ключи массива являются индексами, так что, повторив итерации над ними два раза, мы получим желаемый эффект.</p>
<p>Надеюсь, что этот пост даёт вам представление о гибкости, присущей циклам Perl 6 и как легко они могут быть использованы для решения ряда общих задач. Прежде чем расстаться, я собираюсь ответить на один последний вопрос, который у кого-то возник.</p>
<p>А что, спросите вы, если я захочу перебрать четыре массива за раз?</p>
<pre class="brush: perl; title: ; notranslate">for @one Z @two Z @three Z @four -&gt; $one, $two, $three, $four { ... }</pre>
<p>Вот список ассоциативных инфиксных операторов, то есть &#8212; наслаждайтесь.</p>
<p>© <a href="http://perl6advent.wordpress.com/2009/12/07/day-7-looping-for-fun-and-profit/">Оригинальная статья.</a></p>
<p>P.S.: Спасибо товарищу <a href="http://translated.by/bvp/">bvp</a> за помощь в переводе.</p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li><li><a href="http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii" title="День 3: статические типы и мульти-функции">День 3: статические типы и мульти-функции</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>День 6: Входя в Гиперпространство</title>
		<link>http://ky6uk.org/den-6-vxodya-v-giperprostranstvo?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-6-vxodya-v-giperprostranstvo</link>
		<comments>http://ky6uk.org/den-6-vxodya-v-giperprostranstvo#comments</comments>
		<pubDate>Tue, 16 Mar 2010 16:31:08 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>
		<category><![CDATA[Rakudo]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=464</guid>
		<description><![CDATA[Вольный перевод шестой статьи цикла Perl 6 Advent Calendar на русский язык. Вчера pmichaud предствавил гипероператоры Perl 6 (рус.). Я хотел бы продолжить обзор этих мощных метаоператоров. Во-первых, я буду использовать вспомогательную функцию lsay для упрощения и красивого вывода списков. Теперь мы можем начать рассматривать примеры гипероператоров. В этой заметке я буду использовать >> и [...]]]></description>
			<content:encoded><![CDATA[<p>Вольный перевод шестой статьи цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a> на русский язык.<br />
<span id="more-464"></span><br />
Вчера pmichaud предствавил <a href="http://perl6advent.wordpress.com/2009/12/05/day-5-metaoperator/">гипероператоры Perl 6</a> (<a href="http://ky6uk.org/den-5-metaoperatory">рус.</a>). Я хотел бы продолжить обзор этих мощных метаоператоров.</p>
<p>Во-первых, я буду использовать вспомогательную функцию <em>lsay</em> для упрощения и красивого вывода списков.</p>
<pre class="brush: perl; title: ; notranslate">sub lsay(@a) { @a.perl.say }</pre>
<p>Теперь мы можем начать рассматривать примеры гипероператоров. В этой заметке я буду использовать >> и << вместо » и «, в основном потому, что они легче для моих глаз. (Я боюсь, что потребуется взять очки.) » и «, как правило, считаются истинной записью оператора, но ASCII-версия так же будет работать.</p>
<p>Для начала основы: складываем два списка одинаковой длины:</p>
<pre class="brush: plain; title: ; notranslate">&gt; lsay (1, 2, 3, 4) &lt;&lt;+&gt;&gt; (3, 1, 3, 1)
[4, 3, 6, 5]
&gt; lsay (1, 2, 3, 4) &gt;&gt;+&lt;&lt; (3, 1, 3, 1)
[4, 3, 6, 5]</pre>
<p>При одинаковой длине массивов нет никакой разницы между этими формами. Но если длина различна:</p>
<pre class="brush: plain; title: ; notranslate">&gt; lsay (1, 2, 3, 4) &lt;&lt;+&gt;&gt; (3, 1)
[4, 3, 4, 5]
&gt; lsay (1, 2, 3, 4) &gt;&gt;+&lt;&lt; (3, 1)
Non-dwimmy hyperoperator cannot be used on arrays of different sizes or dimensions.</pre>
<p>Как правило, список, на который указывает гипероператор "острым" концом, может быть расширен если он короче чем другой; он расширяется повторением последнего элемента этого списка. В тоже время список, на который указывает "тупой" конец гипероператора, не может быть расширен. Все комбинации разрешены, поэтому вы можете указать на то, что расширена может быть только левая сторона (<<+<<), только правая (>>+>>), обе стороны могут быть расширены (<<+>>), или ни одна из сторон не может быть расширена (>>+<<). Одиночные скаляры так же расширяемы:</p>
<pre class="brush: plain; title: ; notranslate">&gt; lsay (1, 2, 3, 4) &gt;&gt;+&gt;&gt; 2
[3, 4, 5, 6]
&gt; lsay 3 &lt;&lt;+&lt;&lt; (1, 2, 3, 4)
[4, 5, 6, 7]</pre>
<p>В основном, гипероператоры используются с инфиксными операторам. Теоретически, вы так же можете использовать их с префиксными или постфиксными операторами:</p>
<pre class="brush: plain; title: ; notranslate">&gt; lsay ~&lt;&lt;(1, 2, 3, 4)
[&quot;1&quot;, &quot;2&quot;, &quot;3&quot;, &quot;4&quot;]
&gt; lsay (1, 2, 3, 4)&gt;&gt;++
[2, 3, 4, 5]</pre>
<p>На практике такое использование не было осуществлено в <a href="http://rakudo.org/">Rakudo</a>, за исключением одного особого случая:</p>
<pre class="brush: plain; title: ; notranslate">&gt; lsay (0, pi/4, pi/2, pi, 2*pi)&gt;&gt;.sin
[0, 0.707106781186547, 1, 1.22464679914735e-16, -2.44929359829471e-16]
&gt; lsay (-1, 0, 3, 42)&gt;&gt;.Str
[&quot;-1&quot;, &quot;0&quot;, &quot;3&quot;, &quot;42&quot;]</pre>
<p>То есть >>. вызывает метод <em>Str</em> на каждом элементе списка.</p>
<p>Насколько бы вам не хотелось написать <em>@array>>.say</em>, не делайте этого. Это может работать в текущей версии Rakudo, но при использовании гипероператоров вы обещаете что операция параллелизуема, и порядок операций на списке(-ах) не фиксирован. Надеюсь, что в будущих версиях Perl 6 эти операции будут выполняться параллельно.</p>
<p>Другие примечания: Гипероператоры работают не только со встроенными операторами. Они будут работать с любым новым оператором который вы определите. (В основном, сейчас это уже работает в Rakudo.) Гипероператоры будут работать с in-place операторами, напрмиер <em>@a >>/=>> 2</em> разделит весь массив на 2. (Это не работает в текущей версии Rakudo.) Они будут работать с многомерными списками, с деревьями и с хэшами; смотрите <a href="http://perlcabal.org/syn/S03.html#Hyper_operators">S03 Hyper operators</a>. (Насколько я знаю, они еще не работают в Rakudo.)</p>
<p>Я больше не знаю примеров использования, но область применения гипероператоров достаточно широка. Например класс <a href="http://github.com/LastOfTheCarelessMen/Vector/blob/master/lib/Vector.pm">Vector</a> написанный <a href="http://github.com/LastOfTheCarelessMen">LastOfTheCarelessMen</a> довольно неплох — это реализация N-мерного вектора без единой явной петли.</p>
<p>&copy; <a href="http://perl6advent.wordpress.com/2009/12/06/day-6-going-into-hyperspace/">Оригинальная статья.</a></p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-1-poluchaem-rakudo" title="День 1: Получаем Rakudo">День 1: Получаем Rakudo</a></li><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-6-vxodya-v-giperprostranstvo/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>День 5: Метаоператоры</title>
		<link>http://ky6uk.org/den-5-metaoperatory?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-5-metaoperatory</link>
		<comments>http://ky6uk.org/den-5-metaoperatory#comments</comments>
		<pubDate>Fri, 25 Dec 2009 23:11:11 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=405</guid>
		<description><![CDATA[Перевод пятой статьи цикла Perl 6 Advent Calendar на русский язык. В коробке четвертого дня мы видели интересную функцию для нахождения факториала: Итак, как же она работает? Открытие сегодняшней праздничной коробки даст нам ответы на некоторые вопросы! Perl 6 имеет несколько различных “мета операторов”, которые изменяют существующие операторы для предоставления нам более мощного функционала. Квадратные [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод пятой статьи цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a> на русский язык.<br />
<span id="more-405"></span><br />
В коробке четвертого дня мы видели интересную функцию для нахождения факториала:</p>
<pre class="brush: perl; title: ; notranslate">sub fac(Int $n) {
    [*] 1..$n
}</pre>
<p>Итак, <em>как же</em> она работает? Открытие сегодняшней праздничной коробки даст нам ответы на некоторые вопросы!</p>
<p>Perl 6 имеет несколько различных “мета операторов”, которые изменяют существующие операторы для предоставления нам более мощного функционала.</p>
<p>Квадратные скобки являются “метаоператором сокращения”. Они позволяют встроить оператор, находящийся между скобок, в правую часть выражения. Оператор в таких скобках будет помещен между каждой парой элементов списка. Например выражение</p>
<pre class="brush: perl; title: ; notranslate">[+]  1, $a, 5, $b</pre>
<p>можно записать как</p>
<pre class="brush: perl; title: ; notranslate">1 + $a + 5 + $b</pre>
<p>Это дает нам удобный механизм “сумма всех элементов в списке”:</p>
<pre class="brush: perl; title: ; notranslate">$sum = [+] @a;    # сумма всех элементов массива @a</pre>
<p>Большинство встроенных операторов (включая пользовательские) могут быть помещены в квадратные скобки чтобы сократить запись:</p>
<pre class="brush: perl; title: ; notranslate">$prod = [*] @a;         # умножение всех элементов @a
$mean = ([+] @a) / @a;  # рассчитать среднее значение @a
$sorted = [&lt;=] @a;      # возвратит true если элементы в @a численно отсортированы
$min = [min] @a, @b;    # находит наименьший элемент в объединенных @a и @b</pre>
<p>Теперь мы видим, что в функции поиска факториала выражение</p>
<pre class="brush: perl; title: ; notranslate">[*] 1..$n</pre>
<p>возвращает результат умножения всех чисел от 1 до $n.</p>
<p>Другим полезным метаоператором является “гипер-оператор”. Помещение </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">»</div></div>
<p>и/или </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">«</div></div>
<p>(или ASCII эквивалент </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&amp;gt;&amp;gt;</div></div>
<p>и </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&amp;lt;&amp;lt;</div></div>
<p>) рядом с оператором превращает его в “гипер-оператор”, который работает с элементами списка. Например следующее поместит в </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@c</div></div>
<p>результат попарного сложения элементов в </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@a</div></div>
<p>и </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@b</div></div>
<p>:</p>
<pre class="brush: perl; title: ; notranslate">@c = @a »+« @b;</pre>
<p>В Perl 5 мы бы написали примерно следующее:</p>
<pre class="brush: perl; title: ; notranslate">for ($i=0; $i&lt;@a; $i++) {
    $c[$i] = $a[$i] + $b[$i];
}</pre>
<p>что выглядит несколько длиннее.</p>
<p>Как и в случае с оператором сокращения, мы можем использовать этот оператор с рядом встроенных или пользовательских:</p>
<pre class="brush: perl; title: ; notranslate"># увеличение всех элементов в @xyz на еденицу
@xyz»++

# каждый элемент в @x будет минимальным из @a и @b
@x = @a »min« @b;</pre>
<p>Мы так же можем повернуть углы, чтобы скаляры работали как массивы:</p>
<pre class="brush: perl; title: ; notranslate"># умножает каждый элемент @a на 3.5
@b = @a »*» 3.5;

# умножает каждый элемент @x на $m и прибавляет $b
@y = @x »*» $m »+» $b;

# обращает все элементы @x
    @inv = 1 «/« @x;

# объединяет @last, @first и помещает в @full
@full = (@last »~» ', ') »~« @first;</pre>
<p>Разумеется, операторы сокращения и гипер-операторы можно использовать одновременно:</p>
<pre class="brush: perl; title: ; notranslate"># вычислить сумму квадратов элементов в @x
$sumsq = [+] ( @x »**» 2);</pre>
<p>Существует много других доступных метаоператоров, включая </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">X</div></div>
<p>(крест),</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">R</div></div>
<p>(обращение), </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">S</div></div>
<p>(последовательность). На самом деле “in-place” операторы, такие как </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">+=</div></div>
<p>, </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">*=</div></div>
<p>, </p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">~=</div></div>
<p>, являются лишь метаформой оператора равенства:</p>
<pre class="brush: perl; title: ; notranslate">$a += 5;      # так же как $a = $a + 5;
$b //= 7;     # так же как $b = $b // 7;
$c min= $d;   # так же как $c = $c min $d;</pre>
<p>© <a href="http://perl6advent.wordpress.com/2009/12/05/day-5-metaoperator/">Оригинальная статья.</a></p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li><li><a href="http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii" title="День 3: статические типы и мульти-функции">День 3: статические типы и мульти-функции</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-5-metaoperatory/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>День 4: Тестирование</title>
		<link>http://ky6uk.org/den-4-testirovanie?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-4-testirovanie</link>
		<comments>http://ky6uk.org/den-4-testirovanie#comments</comments>
		<pubDate>Tue, 15 Dec 2009 23:15:19 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=384</guid>
		<description><![CDATA[Четвертая статья цикла Perl 6 Advent Calendar на русском языке. Авторы Perl имеют давнюю привычку снабжать тестами свои модули, и в Perl 6 мы планируем продолжить эту замечательную традицию. Тестирование очень простое. Традиционный perl-way &#8212; это выводить данные в Test Anything Protocol. Но вы не должны делать это сами, вы можете использовать для этого специальный [...]]]></description>
			<content:encoded><![CDATA[<p>Четвертая статья цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a> на русском языке.<br />
<span id="more-384"></span><br />
Авторы Perl имеют давнюю привычку снабжать тестами свои модули, и в Perl 6 мы планируем продолжить эту замечательную традицию.</p>
<p>Тестирование очень простое. Традиционный perl-way &#8212; это выводить данные в <a href="http://testanything.org/">Test Anything Protocol</a>. Но вы не должны делать это сами, вы можете использовать для этого специальный модуль.</p>
<p>Предположим, что вы написали замечательную функцию вычисления факториала:</p>
<pre class="brush: plain; title: ; notranslate">sub fac(Int $n) {
    [*] 1..$n
}</pre>
<p>Сейчас нас не интересует как работает функция – мы хотим это выяснить. Так давайте проверим:</p>
<pre class="brush: plain; title: ; notranslate">use v6;

sub fac(Int $n) {
    [*] 1..$n
}

use Test;
plan 6;

is fac(0), 1,  'fac(0) работает';
is fac(1), 1,  'fac(1) работает';
is fac(2), 2,  'fac(2) работает';
is fac(3), 6,  'fac(3) работает';
is fac(4), 24, 'fac(4) работает';

dies_ok { fac('ох, я же строка') }, 'можно вызывать только с целым аргументом';</pre>
<p>И запустим:</p>
<pre class="brush: plain; title: ; notranslate">$ perl6 fac-test.pl
1..6
ok 1 - fac(0) работает
ok 2 - fac(1) работает
ok 3 - fac(2) работает
ok 4 - fac(3) работает
ok 5 - fac(4) работает
ok 6 - можно вызывать только с целым аргументом</pre>
<p>Здесь <em>use Test;</em> загружает модуль тестирования, <em>plan 6;</em> говорит о том, что мы хотим запустить шесть испытаний. Затем идут пять строк шаблона <em>is $got, $expected, $description</em>. <em>is()</em> сравнивает строки, но поскольку целое всегда можно представить строкой, это нормально.</p>
<p>И наконец строкой <em>dies_ok { $some_code }, $description</em> мы проверяем, что вызов функции с нецелым аргументом является критической ошибкой.</p>
<p>Вывод имеет следующий вид: <em>1..6</em>, затем по одной строке на каждый тест, который начинается на <em>ok</em> (или <em>not ok</em> если тест провален), номер теста, пробел, тире, пробел и описание теста.</p>
<p>Предположим, что вы запускаете больше тестов и не хотите смотреть на вывод каждого, но хотите общий результат. Команда <em><a href="http://search.cpan.org/perldoc?prove">prove</a></em> из Perl 5 даст вам следующее:</p>
<pre class="brush: plain; title: ; notranslate">prove --exec perl6 fac-test.pl
fac-test.pl .. ok
All tests successful.
Files=1, Tests=6, 11 wallclock secs ( 0.02 usr  0.00 sys + 10.26 cusr  0.17 csys = 10.45 CPU)
Result: PASS</pre>
<p>Вы так же можете поместить все ваши файлы с тестами в отдельную директорию, например <em>t/</em>, и запустить <em>prove</em> рекурсивно на все <em>.t</em> файлы в этой директории:</p>
<pre class="brush: plain; title: ; notranslate">prove --exec perl6 -r t</pre>
<p>Так же неплохо поместить эту строку в ваш <em>Makefile</em>, чтобы просто ввести команду <em>make</em> для запуска тестов.</p>
<p>© <a href="http://perl6advent.wordpress.com/2009/12/04/day-4-testing/">Оригинальная статья.</a></p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii" title="День 3: статические типы и мульти-функции">День 3: статические типы и мульти-функции</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-4-testirovanie/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>День 3: статические типы и мульти-функции</title>
		<link>http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-3-staticheskie-tipy-i-multi-funkcii</link>
		<comments>http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii#comments</comments>
		<pubDate>Wed, 09 Dec 2009 18:35:11 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=371</guid>
		<description><![CDATA[Перевод на русский язык третьей статьи из цикла Perl 6 Advent Calendar. Пришло время открыть третью коробку с подарком. Внутри&#8230; Эй, посмотрите, похоже у нас целых два подарка! Внутри коробки статические типы и мульти-функции (multi subs). В Perl 5, $scalar переменные могут содержать либо ссылки, либо значения. В частности, значениями может быть всё что угодно. [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод на русский язык <a href="http://perl6advent.wordpress.com/2009/12/03/day-3-static-types-and-multi-subs/">третьей статьи</a> из цикла <a href="http://perl6advent.wordpress.com/">Perl 6 Advent Calendar</a>.<br />
<span id="more-371"></span><br />
Пришло время открыть третью коробку с подарком. Внутри&#8230; Эй, посмотрите, похоже у нас целых два подарка! Внутри коробки статические типы и мульти-функции (multi subs).</p>
<p>В Perl 5, <em>$scalar</em> переменные могут содержать либо ссылки, либо значения. В частности, значениями может быть всё что угодно. Они могут содержать числа, строки, даты: буквально все, что вы пожелаете. Это обеспечивает определенную гибкость, но за счет ясности.</p>
<p>Perl 6 собирается изменить это, введя статические типы. Если вы хотите какую-либо переменную, вы просто помещаете имя типа между <em>my</em> и <em>$variable-type</em>. Например, создание переменной типа Int выглядит следующим образом:</p>
<pre class="brush: plain; title: ; notranslate">my Int $days = 24;</pre>
<p>Другие статические типы могут выглядеть так:</p>
<pre class="brush: plain; title: ; notranslate">my Str $phrase = &quot;Hello World!&quot;;
my Num $pi = 3.141;
my Rat $other_pi = 22/7;</pre>
<p>Если вы все еще хотите использовать старое поведение переменных, вы можете не пользоваться статическими типами.</p>
<p>Этот подарок идет рука-об-руку со следующим подарком в коробке: мульти-функции. Что это такое &#171;мульти-функции&#187;? Если коротко, то мульти-функции позволяют перегрузить имена функций (sub). На самом деле мульти-функции могут делать гораздо больше, но эти подарки в другой день. А сейчас посмотрите на несколько примеров использования мульти-функций:</p>
<pre class="brush: plain; title: ; notranslate">multi sub identify(Int $x) {
    return &quot;$x - целое.&quot;;
}

multi sub identify(Str $x) {
    return qq&lt;&quot;$x&quot; - строка.&gt;;
}

multi sub identify(Int $x, Str $y) {
    return &quot;Мы имеем целое $x, и строку \&quot;$y\&quot;.&quot;;
}

multi sub identify(Str $x, Int $y) {
    return &quot;Мы имеем строку \&quot;$x\&quot;, и целое $y.&quot;;
}

multi sub identify(Int $x, Int $y) {
    return &quot;Мы имеем два целых $x и $y.&quot;;
}

multi sub identify(Str $x, Str $y) {
    return &quot;Мы имеем две строки \&quot;$x\&quot; и \&quot;$y\&quot;.&quot;;
}

say identify(42);
say identify(&quot;Это круто!&quot;);
say identify(42, &quot;Это круто!&quot;);
say identify(&quot;Это круто!&quot;, 42);
say identify(&quot;Это круто!&quot;, &quot;Я гарантирую!&quot;);
say identify(42, 24);</pre>
<p>Существует много возможностей воспользоваться этими двумя подарками. Попробуйте поиграть с ними и возвращайтесь к нашему дереву для получения новых подарков, которые могут использовать эти возможности в полной мере. ☺</p>
<p><a href="http://perl6advent.wordpress.com/2009/12/03/day-3-static-types-and-multi-subs/">Оригинальная статья на английском</a>.</p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>День 2: Красота Форматирования</title>
		<link>http://ky6uk.org/den-2-krasota-formatirovaniya?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-2-krasota-formatirovaniya</link>
		<comments>http://ky6uk.org/den-2-krasota-formatirovaniya#comments</comments>
		<pubDate>Tue, 08 Dec 2009 18:42:37 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=357</guid>
		<description><![CDATA[Представляю перевод на русский язык второй статьи (Day 2: The beauty of formatting) цикла Perl 6 Advent Calendar. Статья посвящена форматированию в Perl 6. Разворачиваем второй подарок, который принёс нам на рождество Perl 6, и находим&#8230; метод с именем .fmt. Если вы знакомы со sprintf, то будете чувствовать себя как дома с .fmt. Если же [...]]]></description>
			<content:encoded><![CDATA[<p>Представляю перевод на русский язык второй статьи (<a href="http://perl6advent.wordpress.com/2009/12/02/day-2-the-beauty-of-formatting/">Day 2: The beauty of formatting</a>) цикла <a href="http://perl6advent.wordpress.com/2009/12/01/perl-6-advent-calendar/">Perl 6 Advent Calendar</a>. Статья посвящена форматированию в Perl 6.<span id="more-357"></span></p>
<p>Разворачиваем второй подарок, который принёс нам на рождество Perl 6, и находим&#8230; метод с именем <em>.fmt</em>.</p>
<p>Если вы знакомы со <em>sprintf</em>, то будете чувствовать себя как дома с <em>.fmt</em>. Если же вы не знаете про <em>sprintf</em> или же знаете недостаточно, то подробности можно узнать на соответствующей <a href="http://perldoc.perl.org/functions/sprintf.html">странице perldoc</a>. Хоть она и длинная, не углубляйтесь. Просто наслаждайтесь этим.</p>
<p>Вернемся к <em>.fmt</em>, храброй младшей сестре <em>sprintf</em>. Вот несколько способов использования <em>.fmt</em> для форматирования строк и чисел:</p>
<pre class="brush: plain; title: ; notranslate">say 42.fmt('%+d')                # '+42'
say 42.fmt('%4d')                # '  42'
say 42.fmt('%04d')               # '0042'
say :16&lt;1337f00d&gt;.fmt('%X')      # '1337F00D'</pre>
<p>Все это хорошо и замечательно, но не более чем короткая форма <em>sprintf</em>. Большое дело, верно?</p>
<p>Я еще не рассказал вам, что метод <em>.fmt</em> перегружен и работает по-разному на массивах (или точнее на списках):</p>
<pre class="brush: plain; title: ; notranslate">say &lt;huey dewey louie&gt;.fmt       # 'huey dewey louie'
say &lt;10 11 12&gt;.fmt('%x')         # 'a b c'
say &lt;1 2 3&gt;.fmt('%02d', '; ')    # '01; 02; 03'</pre>
<p>Кроме того, <em>.fmt</em> так же переопределен и на хэшах:</p>
<pre class="brush: plain; title: ; notranslate">say { foo =&gt; 1, bar =&gt; 2 }.fmt   # 'foo     1
                                 #  bar     2'

say { Apples =&gt; 5, Oranges =&gt; 10 }.fmt('%s cost %d euros')
                                 # 'Apples cost 5 euros
                                 #  Oranges cost 10 euros'

say { huey =&gt; 1, dewey =&gt; 2, louie =&gt; 3 }.fmt('%s', ' -- ')
                                 # 'huey -- dewey -- louie'</pre>
<p>При работе с хешами результат может выводиться в другом порядке, отличном от представленного выше. Ах да, и там <em>.fmt</em> так же перегружен для пар, но это работает аналогично и для одной. <span style="color: #999999;"><em>(прим. переводчика: не понял смысла последнего предложения, просьба поправить)</em></span></p>
<p><em>.fmt</em> является маленьким полезным инструментом, когда вам нужно изменить некоторое значение, или массив, или хеш в некотором заданном формате. Это как <em>sprintf</em>, только еще для массивов и хешей.</p>
<p>В этом есть только одна проблема: Perl 6 может подпортить репутацию семейства языков Perl как ужасно читаемых. Для противостояния этой опасности, я оставлю маленький прощальный подарок в форме простой, но густой рождественской ели, написанной на Perl 6 в одну строку:</p>
<pre class="brush: plain; title: ; notranslate">$ perl6 -e 'say &quot; &quot;x 9-$_,&quot;#&quot;x$_*2-1 for 0..9,2 xx 3'
          #
         ###
        #####
       #######
      #########
     ###########
    #############
   ###############
  #################
         ###
         ###
         ###</pre>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-2-krasota-formatirovaniya/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>День 1: Получаем Rakudo</title>
		<link>http://ky6uk.org/den-1-poluchaem-rakudo?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=den-1-poluchaem-rakudo</link>
		<comments>http://ky6uk.org/den-1-poluchaem-rakudo#comments</comments>
		<pubDate>Mon, 07 Dec 2009 23:47:56 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>
		<category><![CDATA[Rakudo]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=341</guid>
		<description><![CDATA[Как я и планировал, выкладываю перевод первой статьи цикла Perl 6 Advent Calendar. Напоминаю, что перевод вольный, по-этому сильно придираться не стоит. Существует много разных частичных реализаций Perl 6. Наиболее полной на данный момент является Rakudo. Для получения Rakudo и дальнейшей работы с ним есть несколько путей, но если вас интересует помощь в разработке и отслеживание [...]]]></description>
			<content:encoded><![CDATA[<p>Как я и <a href="http://ky6uk.org/perl-6-advent-calendar-na-russkom">планировал</a>, выкладываю перевод <a href="http://perl6advent.wordpress.com/2009/12/01/day-1-getting-rakudo/">первой</a> статьи цикла <a href="http://perl6advent.wordpress.com/2009/12/01/perl-6-advent-calendar/">Perl 6 Advent Calendar</a>. Напоминаю, что перевод вольный, по-этому сильно придираться не стоит.<br />
<span id="more-341"></span><br />
Существует много разных частичных реализаций Perl 6. Наиболее полной на данный момент является <a href="http://rakudo.org/">Rakudo</a>. Для получения Rakudo и дальнейшей работы с ним есть несколько путей, но если вас интересует помощь в разработке и отслеживание текущего статуса, то наилучшим вариантом будет получение и сборка Rakudo непосредственно из актуальных исходных кодов.</p>
<p>Для этого вам понадобятся <a href="http://subversion.tigris.org/">Subversion (svn)</a>, <a href="http://git-scm.com/">git</a>, Perl 5.8 или новее, компилятор языка C и утилита make. В Linux-подобных операционных системах (включая OS X) собрать Rakudo можно следующим образом:</p>
<pre class="brush: plain; title: ; notranslate">$ git clone git://github.com/rakudo/rakudo.git
$ cd rakudo
$ perl Configure.pl --gen-parrot
$ make
$ make test
$ make install</pre>
<p>Здесь опция &#8212;gen-parrot указывает Subversion получить сответствующую версию виртуальной машины <a href="http://www.parrot.org/">Parrot</a> и затем компилирует её.</p>
<p>Для текущего Rakudo, make install не установит его в ваше окружение, это фактически подготовит систему так, что вы сможете запускать исполняемый файл perl6 (созданный в директории rakudo) из любой другой директории. После этого вы можете &#171;поиграть&#187; с Perl 6, запустив perl6 без аргументов, что позволит войти в среду <a href="http://ru.wikipedia.org/wiki/REPL">REPL</a>, где можно непосредственно вводить команды и видеть что они делают. Это может быть невероятно удобным для ознакомления с работой Perl 6.<br />
Например:</p>
<pre class="brush: plain; title: ; notranslate">$ ./perl6
&gt; say &quot;Hello world!&quot;;
Hello world!
&gt; say (10/7).WHAT
Rat()
&gt; say [+] (1..999).grep( { $_ % 3 == 0 || $_ % 5 == 0 } );
233168</pre>
<p>Начинающиеся на $ и &gt; строки &#8212; это то, что вы вводите; другие строки &#8212; это ответ Rakudo. Первый пример просто выводит текст с помощью say. Второй создаёт рациональное число и запрашивает его тип. Третий создаёт список чисел от 1 до 999, о<span onmouseover="_tipon(this)" onmouseout="_tipoff()">тфильтровывает те, которые не делятся на 3 или 5, суммирует их и выводит результат. (Это первая задача <a href="http://projecteuler.net/">проекта Эйлера</a>, спасибо <a href="http://transfixedbutnotdead.com/2009/11/30/eulergy/">draegtun</a> за напоминание.) Мы постараемся объяснить как работают эти вещи в будущих постах.</span></p>
<p><span onmouseover="_tipon(this)" onmouseout="_tipoff()">И еще одно замечание. Если у вас возникли трудности в получении Rakudo, то канал #perl6 на </span>irc.freenode.net может оказаться весьма полезным.</p>
<p><a href="http://perl6advent.wordpress.com/2009/12/01/day-1-getting-rakudo/">Оригинальный текст</a>.</p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/den-1-poluchaem-rakudo/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Perl 6 Advent Calendar на русском</title>
		<link>http://ky6uk.org/perl-6-advent-calendar-na-russkom?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=perl-6-advent-calendar-na-russkom</link>
		<comments>http://ky6uk.org/perl-6-advent-calendar-na-russkom#comments</comments>
		<pubDate>Mon, 07 Dec 2009 22:31:01 +0000</pubDate>
		<dc:creator>Ky6uk</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Perl 6]]></category>

		<guid isPermaLink="false">http://ky6uk.ugatu.net/?p=331</guid>
		<description><![CDATA[Разработчики проекта Rakudo, реализации языка Perl 6 на базе виртуальной машины Parrot, объявили о проведении предрождественского марафона, в рамках которого с 1 по 26 декабря в блоге perl6advent.wordpress.com каждый день будут публиковаться практические уроки, демонстрирующие те или иные возможности Perl 6. В первую неделю декабря в рамках цикла статей было рассказано об установке Rakudo, использованию циклов, операторах форматирования, статических типах, мета-операторах [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Разработчики проекта <a href="http://rakudo.org/">Rakudo</a>, реализации языка Perl 6 на базе виртуальной машины Parrot, объявили о проведении предрождественского марафона, в рамках которого с 1 по 26 декабря в блоге <a href="http://perl6advent.wordpress.com/">perl6advent.wordpress.com</a> каждый день будут публиковаться практические уроки, демонстрирующие те или иные возможности Perl 6. В первую неделю декабря в рамках цикла статей было рассказано об <a href="http://perl6advent.wordpress.com/2009/12/01/day-1-getting-rakudo/">установке Rakudo</a>, <a href="http://perl6advent.wordpress.com/2009/12/07/day-7-looping-for-fun-and-profit/">использованию циклов</a>, <a href="http://perl6advent.wordpress.com/2009/12/02/day-2-the-beauty-of-formatting/">операторах форматирования</a>, <a href="http://perl6advent.wordpress.com/2009/12/03/day-3-static-types-and-multi-subs/">статических типах</a>, <a href="http://perl6advent.wordpress.com/2009/12/05/day-5-metaoperator/">мета-операторах</a> и <a href="http://perl6advent.wordpress.com/2009/12/04/day-4-testing/">приемах тестирования</a>.</p>
<p>Что касается даты релиза Perl 6, то она по прежнему остается загадкой. Несколько лет назад Ларри Уолл заявил, что релиз выйдет накануне рождества, но не уточнил год этого события. Тем временем первый стабильный релиз проекта Rakudo <a href="http://www.opennet.ru/opennews/art.shtml?num=22934">ожидается</a> в апреле следующего года.</p></blockquote>
<p>© <a href="http://www.opennet.ru/opennews/art.shtml?num=24567">opennet.ru</a></p>
<p>После прочтения данной новости я решил написать вольный перевод этих уроков на русский язык, так как сам посвятил пару лет программированию на Perl 5 и с нетерпением жду релиз Perl 6. Посмотрим, что из этого получится.</p>
<h4>Что уже можно почитать</h4>
<p><a href="http://ky6uk.org/den-1-poluchaem-rakudo">День 1: Получаем Rakudo</a><br />
<a href="http://ky6uk.org/den-2-krasota-formatirovaniya">День 2: Красота Форматирования</a><br />
<a href="http://ky6uk.org/den-3-staticheskie-tipy-i-multi-funkcii">День 3: статические типы и мульти-функции</a><br />
<a href="http://ky6uk.org/den-4-testirovanie">День 4: Тестирование</a><br />
<a href="http://ky6uk.org/den-5-metaoperatory">День 5: Метаоператоры</a><br />
<a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo">День 6: Входя в Гиперпространство</a><br />
<a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya">День 7: Циклы для пользы и развлечения.</a><br />
<a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya">День 8: расчесываем ограничения</a></p>
<h3  class="related_post_title">Похожие статьи</h3><ul class="related_post"><li><a href="http://ky6uk.org/den-8-raschesyvaem-ogranicheniya" title="День 8: расчесываем ограничения">День 8: расчесываем ограничения</a></li><li><a href="http://ky6uk.org/den-7-cikly-dlya-polzy-i-razvlecheniya" title="День 7: Циклы для пользы и развлечения">День 7: Циклы для пользы и развлечения</a></li><li><a href="http://ky6uk.org/den-6-vxodya-v-giperprostranstvo" title="День 6: Входя в Гиперпространство">День 6: Входя в Гиперпространство</a></li><li><a href="http://ky6uk.org/den-5-metaoperatory" title="День 5: Метаоператоры">День 5: Метаоператоры</a></li><li><a href="http://ky6uk.org/den-4-testirovanie" title="День 4: Тестирование">День 4: Тестирование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://ky6uk.org/perl-6-advent-calendar-na-russkom/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

