<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-5961960787980289155</id><updated>2009-12-18T14:43:13.898-08:00</updated><title type='text'>Unencoded – Perl, Apache, DB, AJAX, Qt, C++, Web</title><subtitle type='html'>Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.unencoded.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-910051698761256639</id><published>2009-11-26T01:03:00.000-08:00</published><updated>2009-11-26T01:11:52.484-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='переменная'/><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='структуры данных'/><category scheme='http://www.blogger.com/atom/ns#' term='на русском'/><title type='text'>Perl :: Структуры данных :: Переменная :: Объявление переменной</title><content type='html'>В арсенале &lt;b&gt;Perl&lt;/b&gt; имеется достаточно широкий набор приёмов, которые могут использоваться разработчиком при создании переменных там, где это необходимо в данный момент; однако за это, как, впрочем, и за всё остальное в этой жизни, программисту приходится платить, а здесь начинается та часть, где надо быть особенно внимательным. Данный &lt;b&gt;язык программирования&lt;/b&gt;, в самом деле, может облегчить существование разработчика за счёт правильного использования специальных помощников ‘&lt;span style="color: #b45f06;"&gt;my&lt;/span&gt;’, ‘&lt;span style="color: #b45f06;"&gt;local&lt;/span&gt;’, ‘&lt;span style="color: #b45f06;"&gt;our&lt;/span&gt;’. Каждый из них по-своему может быть полезен, и сберечь массу времени при отладке готовых программ, не говоря о том, что можно (и должно) использовать их "врождённые" свойства, которые не надо "&lt;b&gt;программировать&lt;/b&gt;" самому, поскольку создатели языка об этом уже позаботились, а разработчику надо всего лишь уметь правильно ими пользоваться.&lt;br /&gt;&lt;br /&gt;Главным в работе с переменными, равно как и со всеми другими имеющимися типами данных языка, является так называемая "&lt;b&gt;область видимости&lt;/b&gt;" переменной. Существует несколько простых правил на сей счёт:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;когда программа может использовать несколько одноимённых (но не равных по значению в каждый конкретный момент времени) переменных, в языке существует встроенный механизм "отслеживания" и использования переменных с одинаковыми именами и в разных областях видимости (или блоках), который реализован путём объявления переменной с помощью ‘&lt;span style="color: #351c75;"&gt;our&lt;/span&gt;’; можно сказать, что в данном случае происходит автоматическое "переопределение" значений переменной по ходу всей программы;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;когда же разработчику необходимо каждый раз в пределах какого-либо блока использовать переменную с одним и тем же именем, но с абсолютно "чистым" начальным значением, то, как правило, (и до возникновения ‘&lt;span style="color: #351c75;"&gt;our&lt;/span&gt;’) используется ‘&lt;span style="color: #b45f06;"&gt;my&lt;/span&gt;’;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;в случае же когда программист хочет очень жёстко "привязать" само существование конкретной переменной в пределах одного блока кода и напрочь "забыть" о том, что она когда-то существовала после выхода из него, у него всегда имеется ‘&lt;span style="color: #38761d;"&gt;local&lt;/span&gt;’ для этого.&lt;/li&gt;&lt;/ul&gt;Подобно многим другим языкам программирования объявление переменной может происходить как с присваиванием ей начального значения, так и без оного, например: '&lt;span style="background-color: #b45f06; color: white;"&gt;my $var=1;&lt;/span&gt;', где между переменной и её значением находится оператор присваивания (пожалуйста, не путайте его со знаком «&lt;span style="color: #741b47;"&gt;тождественно равно&lt;/span&gt;» ‘&lt;span style="color: #741b47;"&gt;==&lt;/span&gt;’). Существуют также иные способы присваивания значений переменным, но об этом не здесь и не сейчас.&lt;br /&gt;&lt;br /&gt;Если читатель считает необходимым освежить свои знания по переменным, то раздел стандартной документации '&lt;b&gt;&lt;span style="color: #b45f06;"&gt;perldoc perlvar&lt;/span&gt;&lt;/b&gt;' всегда к Вашим услугам; или же зайдите на любое из зеркал &lt;a href="http://cpan.org/"&gt;CPAN.org&lt;/a&gt;, чтобы найти нужный Вам раздел документации.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-910051698761256639?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/910051698761256639/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/11/perl_26.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/910051698761256639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/910051698761256639'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/11/perl_26.html' title='Perl :: Структуры данных :: Переменная :: Объявление переменной'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-2343711493005845007</id><published>2009-11-24T07:07:00.000-08:00</published><updated>2009-11-24T07:08:00.501-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='on English'/><category scheme='http://www.blogger.com/atom/ns#' term='data structures'/><category scheme='http://www.blogger.com/atom/ns#' term='value'/><category scheme='http://www.blogger.com/atom/ns#' term='dollar'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='scalar'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>Perl :: Data Structures :: Scalar :: Perl scalar value</title><content type='html'>First, &lt;b&gt;Perl&lt;/b&gt; uses the special mark to designate a scalar &lt;b&gt;variable &lt;/b&gt;and it is '&lt;span style="background-color: #b45f06; color: white;"&gt;$&lt;/span&gt;' (dollar sign). As the &lt;b&gt;Perl&lt;/b&gt; father says, he has picked this one just because it looks like 's' that can stand for '&lt;b&gt;&lt;span style="color: #0b5394;"&gt;scalar&lt;/span&gt;&lt;/b&gt;' and it comes handy indeed. But, on the other hand, recalling &lt;b&gt;Larry Wall's&lt;/b&gt; linguistic background it is in place to say that '&lt;span style="background-color: #b45f06; color: white;"&gt;s&lt;/span&gt;' may stand for '&lt;b&gt;&lt;span style="color: #0b5394;"&gt;singular&lt;/span&gt;&lt;/b&gt;', too. This is especially important to keep in mind, when one is using it in &lt;b&gt;Perl &lt;/b&gt;scripting as any scalar variable in &lt;b&gt;Perl &lt;/b&gt;can keep only '&lt;b&gt;&lt;span style="color: #351c75;"&gt;single&lt;/span&gt;&lt;/b&gt;' value. The real thing about everything in &lt;b&gt;Perl &lt;/b&gt;lies near the context, which may make one 'miserable' unless one knows what the context in &lt;b&gt;Perl &lt;/b&gt;is.&lt;br /&gt;&lt;br /&gt;One more general thing about variable names in &lt;b&gt;Perl&lt;/b&gt;, starting not so long before, unlike in many other languages the programmer can give names to his babies and beasts in his native language belonging to, say, Slavonic, Sino-Tibetian, Judaeo-German or any other family. Here are our special thanks to the &lt;b&gt;Unicode&lt;/b&gt; team. It does not make much from efficacy point of view, but adds a lot to the readability of the source code.&lt;br /&gt;&lt;br /&gt;The Perl scalars may look like '&lt;span style="color: #b45f06;"&gt;$var&lt;/span&gt;', and all; or, if one prefers &lt;b&gt;&lt;span style="color: #38761d;"&gt;Chinese &lt;/span&gt;&lt;/b&gt;flavour, he might write something like this: &lt;span style="color: #bf9000;"&gt;$輕&lt;/span&gt; (qìng - easy, light).&lt;br /&gt;&lt;br /&gt;FYI: (%perldoc) perldata - &lt;b&gt;Perl &lt;/b&gt;data types&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-2343711493005845007?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/2343711493005845007/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/11/perl-data-structures-scalar-perl-scalar.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/2343711493005845007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/2343711493005845007'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/11/perl-data-structures-scalar-perl-scalar.html' title='Perl :: Data Structures :: Scalar :: Perl scalar value'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-1920515463866572977</id><published>2009-11-13T07:03:00.000-08:00</published><updated>2009-11-13T07:03:37.784-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='переменная'/><category scheme='http://www.blogger.com/atom/ns#' term='значение переменной'/><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='структуры данных'/><category scheme='http://www.blogger.com/atom/ns#' term='статья'/><category scheme='http://www.blogger.com/atom/ns#' term='на русском'/><title type='text'>Perl :: Структуры данных :: Переменная :: Значение переменной</title><content type='html'>Во-первых, как всем наверное известно, для обозначения &lt;b&gt;переменной&lt;/b&gt; в &lt;b&gt;Perl&lt;/b&gt; используется знак доллара &lt;span style="background-color: #b45f06; color: white;"&gt;‘$’&lt;/span&gt;. Согласно создателю этого языка он выбрал такое обозначение, так как оно очень похоже на латинскую букву&lt;span style="color: #38761d;"&gt; ‘S’&lt;/span&gt; и очень подходит для мнемонического обозначения слова &lt;span style="color: #0b5394;"&gt;‘scalar’&lt;/span&gt; (&lt;b&gt;скаляр&lt;/b&gt;). С другой стороны, памятуя лингвистическое прошлое г-на Волла уместно предположить, что &lt;span style="color: #38761d;"&gt;‘S’&lt;/span&gt; может относиться и к слову &lt;span style="color: #b45f06;"&gt;‘single’&lt;/span&gt; (один, единственный).&lt;br /&gt;&lt;br /&gt;Это становится актуальным, когда надо запомнить, что в &lt;b&gt;Perl&lt;/b&gt; скалярный контекст соотносят с &lt;b&gt;переменной&lt;/b&gt;, то есть, &lt;b&gt;скаляром&lt;/b&gt;. По большому счёту всё, что надо знать в данном языке (или почти всё) вращается вокруг контекста, что может стать камнем преткновения для любого программиста.&lt;br /&gt;&lt;br /&gt;Ещё одно замечание в отношении имён переменных в &lt;b&gt;Perl&lt;/b&gt;: не так давно и совсем не так как во многих других языках программирования стало возможным называть &lt;b&gt;переменные &lt;/b&gt;практически на любом языке (речь не идёт о &lt;b&gt;транслитерации&lt;/b&gt;): язык, который имеет письменность и представлен в наборе символов &lt;span style="color: #741b47;"&gt;Юникода &lt;/span&gt;может принадлежать к Индо-Европейской, Сино-Тибетской, Романо-Германской или любой другой семье языков.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Переменная &lt;/b&gt;может выглядеть как&lt;span style="background-color: #351c75; color: white;"&gt; ‘$var’ &lt;/span&gt;в традиционном представлении или же если есть необходимость представления имени переменной, скажем, на китайском, то это может быть нечто наподобие &lt;span style="color: #274e13;"&gt;$輕&lt;/span&gt; (qìng - лёгкий, легко).&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #741b47;"&gt;FYI: (%perldoc) perldata - Perl data types&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-1920515463866572977?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/1920515463866572977/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/11/perl.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/1920515463866572977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/1920515463866572977'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/11/perl.html' title='Perl :: Структуры данных :: Переменная :: Значение переменной'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-8564262054185523374</id><published>2009-11-02T01:59:00.000-08:00</published><updated>2009-11-02T02:14:14.379-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='on English'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML::Mason'/><title type='text'>Perl :: Myths and reality of HTML::Mason</title><content type='html'>&lt;h3&gt;What everyone knows&lt;/h3&gt;&lt;br /&gt;For those, who himself even had never dealt with &lt;b&gt;Perl&lt;/b&gt; the very words &lt;b&gt;HTML::Mason&lt;/b&gt; are hardly unfamiliar; and &lt;b&gt;&lt;span style="color: #0b5394;"&gt;CPAN&lt;/span&gt;&lt;/b&gt; might be a source for either admiration or envy. Among the tremendous number of library modules, &lt;b&gt;HTML::Mason&lt;/b&gt; could survive a row of releases of his own and got qualified as entirely professional web-development environment. Though one can narrate a lot on what exactly it is, but if in the course of conversation they utter ‘&lt;b&gt;HTML::Mason&lt;/b&gt;’ occasionally, the sharp rejoinders like “well, it’s a mod_perl’s only” aren’t rare. It’s well-known that the module was designed and developed with this Apache web-server extension in mind, however, far not all modules presented at &lt;span style="color: #0b5394;"&gt;CPAN&lt;/span&gt; can (at least in their pods) make a brilliant display of flexible features. In here we’re going to talk how to ‘cut the coat according to the cloth’, that is how to use available things at hand and produce good enough and practical applications.&lt;br /&gt;&lt;br /&gt;Perhaps, there are not so many brave heads can claim they used &lt;b&gt;HTML::Mason&lt;/b&gt; in full and without &lt;span style="color: #38761d;"&gt;mod_perl&lt;/span&gt;+&lt;span style="color: #bf9000;"&gt;Apache&lt;/span&gt; out there; much as well as this, and what the reader might know, is possible with the module. But in our case we’re going to solve a bit different problem and that is how to put in use all &lt;b&gt;HTML::Mason&lt;/b&gt; power when one has got an ordinary web-hosting, offering the old good &lt;b&gt;CGI&lt;/b&gt;.pm.&lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;What Mr. Rolsky is silent about&lt;/h3&gt;&lt;br /&gt;Despite &lt;b&gt;HTML::Mason&lt;/b&gt; possesses an excellent set of docs and examples for virtually any option possible, the real life shows that by intent or not (and there are numerous graphic evidences of that on the Internet) it lacks for &lt;b&gt;CGI&lt;/b&gt; use a lot. No secret that anybody, who ever tried to dive into the problem made their first stop at &lt;b&gt;HTML::Mason&lt;/b&gt;, &lt;b&gt;HTML::Mason::Admin&lt;/b&gt;, &lt;b&gt;HTML::Mason::CGIHandler&lt;/b&gt; and the rest. Well, more often than not they skipped to something else or ... whatever, as those guys once faced this wall obviously never ever got back again. And pitiful are they! The lines authors do not reproach &lt;b&gt;HTML::Mason’s&lt;/b&gt; developers with this notice, but still it could be better to shed more light in this respect for the uninitiated.&lt;br /&gt;Thus, what does the standard documents of &lt;b&gt;HTML::Mason&lt;/b&gt; offer, when there is no way to use &lt;b style="color: #38761d;"&gt;mod_perl&lt;/b&gt;? First, all the options are cut to two as a matter of fact.&lt;br /&gt;&lt;br /&gt;The option using &lt;b&gt;HTML::Mason&lt;/b&gt; within a stand-alone (and baked) cgi-script from the very beginning, if even to omit the scape and scope and scalability and usability, will bring to naught all the mighty of &lt;b&gt;Mason &lt;/b&gt;in its components interoperability and interchangeability, and, say, for system administrators templates are excessive as the standard &lt;b&gt;Perl’s&lt;/b&gt; features are more than enough. To be short, this variant makes a developer to say good-bye to any template system and the most unfortunate is to the Mason’s ability ‘to bind’ components dynamically.&lt;br /&gt;&lt;br /&gt;The next option is pointing to incomplete emulation mode, where &lt;b&gt;HTML::Mason&lt;/b&gt; is working in &lt;b&gt;CGI&lt;/b&gt; environment via &lt;b&gt;HTML::Mason::CGIHandler&lt;/b&gt;. As the Mason developers say it’s a poor man’s option that can re-produce just a few features of what Mason can in &lt;b&gt;&lt;span style="color: #38761d;"&gt;mod_perl&lt;/span&gt;&lt;/b&gt; mode. And that is true. The question ‘does anyone need this?’ is out of place here; on the other hand, is it good to start anything what is of no interest to finish is open yet.&lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;How much and what for&lt;/h3&gt;&lt;br /&gt;The invention history is redundant in examples born right in between two or more technologies or techniques or just notions. Fortunately, &lt;b&gt;HTML::Mason&lt;/b&gt; is not an exception. Those, who knows something on the Internet history, the history of &lt;b&gt;CGI &lt;/b&gt;might be a good example. The protocol could meet almost all existing earlier needs for client-server communication. But the time passes by and the people are acquiring more sophisticated toys.&lt;br /&gt;&lt;br /&gt;The old story on how hard for a web-designer to understand problems of a web-developer seems getting shabby since the world saw various &lt;b&gt;CMS &lt;/b&gt;and the like. Nevertheless, as usual in the first place (but may be not so usual) the choice of platform arises. If one tries to compile the list of hosting providers offering &lt;b&gt;&lt;span style="color: #38761d;"&gt;mod_perl&lt;/span&gt;&lt;/b&gt; feature, he might be disappointed to learn how much that costs and how few are those who can offer the feature indeed. They state many reasons to excuse the price and the main of their own is support; which we cannot accept though. That is why we are turning back to what is offered here and there, to &lt;b&gt;CGI&lt;/b&gt;.pm plus a set of standard features and for free, almost. In case they don’t have &lt;b&gt;HTML::Mason&lt;/b&gt; installed they can do that easily, that’s not a problem, all the problems are just one step ahead, namely, when a happy developer with his home-grown project will try to deploy it at the hosting.&lt;br /&gt;&lt;br /&gt;For the languished readers it is worthy to say that the starting point is the creation of cgi-handler, that is the script which is channeling all ins and outs, coming form &lt;b&gt;CGI&lt;/b&gt; environment and going back, to &lt;b&gt;HTML::Mason &lt;/b&gt;for processing. Till now everything is more or less clear; this is the turn of auto- and &lt;b&gt;dhandler&lt;/b&gt;. Technically, these are common in shape and contents, but due to the difference between &lt;span style="color: #b45f06;"&gt;%ENV&lt;/span&gt; of CGI and &lt;b style="color: #b45f06;"&gt;%ARGS&lt;/b&gt; of &lt;b&gt;Mason &lt;/b&gt;(and these two are really different, not only in names, but also in what they can be containers for) it is strongly recommended to inform &lt;b&gt;HTML::Mason&lt;/b&gt; where to obtain the environment variables.&lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;The theory smelling&lt;/h3&gt;&lt;br /&gt;In theory, or to be more precise in the documentation, they say that autohandler is triggered and executed right before everything else and this is true always; on the other hand, dhandler does … well, everyone knows how it works. But this makes a big difference when transferred into &lt;b&gt;CGI &lt;/b&gt;environment. Dlhandler under such conditions, if one follows the &lt;b&gt;Mason &lt;/b&gt;docs, is not working as needed; well, &lt;b&gt;autohandler &lt;/b&gt;is still there! What’s wrong?&lt;br /&gt;&lt;br /&gt;The question is how to turn on dhandler forcibly, that is how to make it &lt;b&gt;CGI&lt;/b&gt;-aware. The example we placed below might be far from perfect, however, if the service has no heavy load of simultaneous and/or concurrent requests it performs well. Here is the recipe:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;#!/usr/bin/perl&lt;br /&gt;# File: mason_handler.cgi ( cgi handler to process, auto-, dhandler )&lt;br /&gt;use HTML::Mason::CGIHandler;&lt;br /&gt;use lib '/path/to/lib ';  # absolute path to your lib&lt;br /&gt;use YourModule1;    &lt;br /&gt;use YourModule2;    &lt;br /&gt;use utf8;&lt;br /&gt;&lt;br /&gt;# we DO call dhandler explicitly&lt;br /&gt;$ENV{PATH_INFO} = '/path/to/DocumentRoot/dhandler';&lt;br /&gt;&lt;br /&gt;my $h = HTML::Mason::CGIHandler-&amp;gt;new(&lt;br /&gt;  data_dir   =&amp;gt; '/path/to/mason data dir',&lt;br /&gt;  comp_root =&amp;gt; '/path/to/component/root',&lt;br /&gt;  allow_globals =&amp;gt; [qw($globalscalar)],&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;$h-&amp;gt;handle_request;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;What else should be said about HTML::Mason&lt;/h3&gt;&lt;br /&gt;This section is a sort of obligation, or, may be, just a compulsory piece of a development inventory, especially needed for those dealing with non-English web-resources and aware about consequences of ‘&lt;span style="color: #b45f06;"&gt;use utf8&lt;/span&gt;’ usage within &lt;b&gt;HTML::Mason&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;All-known &lt;span style="color: #b45f06;"&gt;UTF-8&lt;/span&gt; is getting more and more common on the Web. The standard Perl documentation says about built-in classes like “&lt;span style="color: #b45f06;"&gt;\p{InBasinLatin}&lt;/span&gt;”, “&lt;span style="color: #b45f06;"&gt;\p{InCyrillic}&lt;/span&gt;” and so on; those when used together, for example, with ‘&lt;span style="color: #bf9000;"&gt;qr()&lt;/span&gt;’ may, and really are, the powerful tools. Also let’s bring forward the old ‘&lt;span style="color: #bf9000;"&gt;quotemeta()&lt;/span&gt;’ that also may be of a good help yet; nonetheless, when it comes to use the like from inside &lt;b&gt;HTML::Mason&lt;/b&gt;, not everything goes smoothly. Suppose, you’ve got a mysql table, which is queried exclusively with ‘&lt;b style="color: #b45f06;"&gt;SET NAMES utf8&lt;/b&gt;’ (so that mixed data make no noise) and which itself has ‘&lt;span style="color: #b45f06;"&gt;CHARSET=utf8 COLLATE=utf8_unicode_ci&lt;/span&gt;’ collation tags placed properly; next, somewhere in the &lt;b&gt;UI &lt;/b&gt;form you must sift the user’s input with fascinating ‘&lt;b style="color: #0b5394;"&gt;s///go&lt;/b&gt;’ (needless to say all your pages are containing the valid &lt;b&gt;XHTML &lt;/b&gt;with meta-tag ‘&lt;span style="color: #b45f06;"&gt;charset=utf-8&lt;/span&gt;’ or generated with &lt;b&gt;HTML::Mason&lt;/b&gt; ‘&lt;span style="color: #b45f06;"&gt;headers_out()&lt;/span&gt;’), but the problem is still there as your regexp isn’t working properly!  Again, as it is said in perldoc – ‘&lt;span style="color: #b45f06;"&gt;use utf8&lt;/span&gt;’ to rescue and place it right into the component… now, regular expression is alright, but the generated page content is odd a bit. Finally, you found Encode.pm with its “&lt;span style="color: #134f5c;"&gt;decode(), encode()&lt;/span&gt;” and feverishly started to “normalize” the utf8 input… it’s the same and not entirely what’s expected.&lt;br /&gt;&lt;br /&gt;Sure, your own story may be a bit different, but the conventional morality is following:&lt;br /&gt;all the data, corresponding &lt;b&gt;UTF8&lt;/b&gt;, in the internal &lt;b&gt;Perl &lt;/b&gt;representation almost always looks differently (and for &lt;b&gt;Perl &lt;/b&gt;as well); the use of data presented in the way, well, they are looking correct in the browser, as well, to be fed to &lt;b&gt;regular expressions&lt;/b&gt;; the latter, if they are well-formed, will process the data happily and supply the correct (read – expected) result. As to the rest of your precious resource, none of the beasts should be let out, otherwise, you’re in troubles: the explicit turning on &lt;b&gt;UTF8 &lt;/b&gt;by any means and in any of the &lt;b&gt;Mason&lt;/b&gt; processed components will result to the correct data display from this one and incorrect within the others.&lt;br /&gt;The problem got the shape, but what’s the solution? It’s time to get back to the sources: they strongly advise to follow ‘divide-and-conquer strategy’; for the case it sounds like: all the routines requiring to process &lt;b&gt;Unicode &lt;/b&gt;(utf8) data with &lt;b&gt;Perl &lt;/b&gt;should reside in modules only, and none of those must be put inside a component; the same is true about the tools like &lt;span style="color: #351c75;"&gt;Encode::encoded/decoded(“utf8”, $datum)&lt;/span&gt;. This is one of the few limitations one should keep in mind while designing his/her &lt;b&gt;HTML::Mason&lt;/b&gt; applications.&lt;br /&gt;&lt;br /&gt;All the said above was ‘&lt;span style="color: #b45f06;"&gt;inside&lt;/span&gt;’, now we’re going to make a set of notes what’s ‘&lt;span style="color: #b45f06;"&gt;outside&lt;/span&gt;’. &lt;b&gt;HTML::Mason&lt;/b&gt;, as the dear reader probably knows already, has some *escape* hooks; it is out of place to repeat the pods and instead we just recall few things like ‘&lt;span style="color: #073763;"&gt;|h&lt;/span&gt;’.&lt;br /&gt;&lt;br /&gt;In fact if one has, say, an &lt;b&gt;English &lt;/b&gt;site, then no worries; in case of  otherwise, and if the developer has to use &lt;b&gt;UTF8&lt;/b&gt;, the following bit of code may help to escape the user’s data properly. It happens, for instance, when there’s a &lt;b&gt;UI &lt;/b&gt;html form; suppose a user has input the data mixed with markup, to avoid his own data to be treated as markup afterwards we do recommend to append to your code something like:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;File name: autohandler&lt;br /&gt;……&lt;br /&gt;% $m-&amp;gt;interp-&amp;gt;set_escape( h =&amp;gt; \&amp;amp;HTML::Mason::Escapes::basic_html_escape );&lt;br /&gt;% $m-&amp;gt;call_next();&lt;br /&gt;……&lt;br /&gt;&lt;br /&gt;file: &lt;your component=""&gt;&lt;br /&gt;……&lt;br /&gt;&amp;lt;% $htmlstring | h %&amp;gt;&lt;br /&gt;……&lt;br /&gt;&lt;/your&gt;&lt;/pre&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;The whole thing sample&lt;/h3&gt;&lt;br /&gt;Finally, we’d like to illustrate what’s said with a plain example.&lt;br /&gt;The example we’re creating a small site, containing the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;perl module with &lt;b&gt;DB &lt;/b&gt;interface;&lt;/li&gt;&lt;li&gt;&lt;b&gt;autohandler &lt;/b&gt;and &lt;b&gt;dhandler&lt;/b&gt;;&lt;/li&gt;&lt;li&gt;a set of &lt;b&gt;components &lt;/b&gt;to construct the simple &lt;b&gt;UI&lt;/b&gt;;&lt;/li&gt;&lt;/ul&gt;The reader will find the comments inside.&lt;br /&gt;&lt;br /&gt;You can &lt;b&gt;download &lt;/b&gt;the example &lt;a href="http://blog.seeuse.com/download/example.zip"&gt;here&lt;/a&gt; (~ 10 Kb).&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-8564262054185523374?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/8564262054185523374/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/11/perl-myths-and-reality-of-htmlmason.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/8564262054185523374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/8564262054185523374'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/11/perl-myths-and-reality-of-htmlmason.html' title='Perl :: Myths and reality of HTML::Mason'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-4901046917098568949</id><published>2009-10-27T06:57:00.000-07:00</published><updated>2009-10-27T07:15:17.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='изучение'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='статья'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML::Mason'/><category scheme='http://www.blogger.com/atom/ns#' term='на русском'/><title type='text'>Perl :: Мифы и реальность с HTML::Mason</title><content type='html'>&lt;h3&gt;То, что знают все&lt;/h3&gt;&lt;br /&gt;Для людей, которые даже никогда сами не имели в своей программерской практике никакого опыта с &lt;b&gt;Perl&lt;/b&gt; само слово &lt;b&gt;HTML::Mason&lt;/b&gt; может быть не ново, а сам &lt;b style="color: #38761d;"&gt;CPAN&lt;/b&gt; может вызывать равно как и зависть, так и восторг. Среди огромного количестве библиотечных модулей данного репозитория, &lt;b&gt;HTML::Mason&lt;/b&gt; уже смог выдержать ряд релизов и квалифицироваться не иначе как профессиональная среда разработки веб-ресурсов. Впрочем, можно долго рассуждать на тему того, что именно представляет из себя это явление, но вот с чем приходилось сталкиваться чаще всего, когда произносилось слово “&lt;b&gt;HTML::Mason&lt;/b&gt;”, так это что-то типа: «ну, так без &lt;span style="background-color: #741b47;"&gt;&lt;span style="color: #f3f3f3;"&gt;mod_per&lt;/span&gt;&lt;span style="background-color: #741b47; color: #f3f3f3;"&gt;l&lt;/span&gt;&lt;/span&gt; это никак!».&lt;br /&gt;&lt;br /&gt;Никто и не скрывает, что данная библиотека и разрабатывалась с этим расширением веб-сервера &lt;b&gt;Apache&lt;/b&gt; в голове; но далеко не все из библиотек, которые присутствуют на &lt;b&gt;CPAN&lt;/b&gt; могут (хотя бы в части pod) «похвастаться» таким разнообразием возможных применений; здесь речь пойдёт о том, как «по одёжке – протягивать ножки», а точнее, как можно используя то, что доступно и под рукой, делать достаточно хорошие и надёжные вещи.&lt;br /&gt;&lt;br /&gt;Наверное, найдётся далеко немного людей, которые могут с гордостью сказать, что вот там-то и там-то они использовали &lt;b&gt;HTML::Mason&lt;/b&gt; в полном объёме не только без &lt;b&gt;mod_perl&lt;/b&gt;, но и без &lt;b&gt;Apache&lt;/b&gt;; многое как и это, о чём Вы, наверняка знаете, тоже возможно с данной библиотекой. Однако в данном случае будет немного иная задача, а именно, как используя практически весь арсенал &lt;b&gt;HTML::Mason&lt;/b&gt; заставить его работать на обычном сервере, где есть лишь старый, добрый CGI.pm.&lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;О чём, «молчит» г-н Рольский&lt;/h3&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;Несмотря на то, что в комплекте &lt;b&gt;HTML::Mason&lt;/b&gt; имеется хороший набор документации и масса примеров практически «на все случаи жизни», практика показывает, что то ли умышленно, то ли нет (и этому существует масса свидетельств в интернете, к сожалению) в отношении &lt;b&gt;CGI &lt;/b&gt;имеется там явный пробел. Разумеется, что все, кто когда-либо пытался решить подобную проблему сразу же обращались к &lt;b&gt;HTML::Mason&lt;/b&gt;, &lt;b&gt;HTML::Mason::Admin&lt;/b&gt;, &lt;b&gt;HTML::Mason::CGIHandler&lt;/b&gt; и прочим вещам. И, наверное, большинство из этих смельчаков либо останавливало выбор на чём-то другом, либо... вообщем, это не важно уже сейчас, поскольку это «большинство» приобрёв некоторый печальный опыт «работы» с &lt;b&gt;HTML::Mason&lt;/b&gt;, возможно, уже никогда более не обращало свой взор сюда снова. А жаль! Авторы этих строк никоим образом не ставят всё это в упрёк команде разработчиков &lt;b&gt;HTML::Mason&lt;/b&gt;, но, наверное, всё же стоило пролить свет на возможности &lt;b&gt;HTML::Mason&lt;/b&gt; в этом направлении для массы несведущих.&lt;br /&gt;&lt;br /&gt;Итак, что же согласно стандартной документации предлагает данная библиотека всем тем, у кого нет возможности пользоваться всеми прелестями &lt;b&gt;&lt;span style="color: #073763;"&gt;mod_perl&lt;/span&gt;&lt;/b&gt;? Сразу надо сказать, что вариантов не очень много и все они, как правило, сводятся к двум.&lt;br /&gt;Вариант использования &lt;b&gt;HTML::Mason&lt;/b&gt; в отдельно взятом (и сделанном) cgi-скрипте с самого начала, даже если не вдаваться в подробности возможной сферы применения, сводит на нет всю мощь &lt;b&gt;HTML::Mason&lt;/b&gt; в части многократного использования в разных местах приложения одних и тех же компонент; а для системных администраторов шаблоны не нужны и вовсе – возможностей Perl хватает с головой. Если кратко, то этот вариант заставляет почти попрощаться с системой шаблонов и, что самое обидное, с тем механизмом, посредством которого они могут взаимодействовать!&lt;br /&gt;&lt;br /&gt;Вариант второй указывает на незавершённую эмуляцию взаимодействия &lt;b&gt;HTML::Mason&lt;/b&gt; с &lt;b&gt;&lt;span style="color: #bf9000;"&gt;Apache&lt;/span&gt; API&lt;/b&gt; в виде &lt;b&gt;HTML::Mason::CGIHandler&lt;/b&gt;. По словам самих разработчиков это лишь «жалкое подобие» того, что возможно в связке с &lt;b&gt;&lt;span style="color: #073763;"&gt;mod_perl&lt;/span&gt;&lt;/b&gt;. И это действительно так. Вопрос «а надо ли это вообще?» авторами данных строк даже никогда не ставился, а вот стоит ли начинать то, что не очень хочется заканчивать, пока остаётся открытым.&lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Что по чём и зачем это надо&lt;/h3&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;История открытий и изобретений пестрит примерами, которые родились на стыке двух или более технологий, или просто понятий. &lt;b&gt;HTML::Mason&lt;/b&gt;, в этом смысле, не является исключением, к счастью. Для тех, кто или знаком с историей Интернета, или просто интересовался ею, должна быть известна история возникновения протокола &lt;b&gt;CGI&lt;/b&gt;; который до известного времени удовлетворял всем известным ранее требованиям динамического взаимодействия клиента и сервера. Времена меняются – люди тоже, а вместе с ними и их «игрушки».&lt;br /&gt;&lt;br /&gt;Старая сказка про то, что веб-дизайнер никогда не сможет понять веб-разработчика начала, кажется, уже устаревать, когда мир увидел всякого рода системы управления контентом, системы шаблонов и иже с ними. Но всегда и везде первым (хотя, впрочем, и не обязательно первым) встаёт вопрос о платформе. Итак, если побродить по бескрайним просторам Интернета, то краеугольным вопросом, в нашем случае, по-прежнему остаётся наличие &lt;b style="color: #0b5394;"&gt;mod_perl&lt;/b&gt; у провайдера. Для тех, кто когда-либо занимался подобным «изысканием» должно быть известно, что хостинг подобного рода далеко не копеечный и встречается далеко не везде.&lt;br /&gt;&lt;br /&gt;Причин тому достаточно, но главная – в якобы дорогостоящем сопровождении данного вида хостинга, с чем мы не можем согласится (и у нас также есть достаточно причин для этого). Поэтому, возвращаемся к тому что может найтись практически везде – к &lt;b&gt;CGI.pm&lt;/b&gt; со стандартными примочками и что стоит действительно копейки. &lt;b&gt;HTML::Mason&lt;/b&gt;, если не установлен, то получить его на обычном хостинге не есть проблема; все проблемы возникают после того, как окрылённый обладатель готового сайта, который собран согласно документации и вроде бы работает «в домашних» условиях, попытается привинтить его на своем хосте у провайдера.&lt;br /&gt;&lt;br /&gt;Чтобы не томить души страждущих, сразу надо сказать, что отправной точкой является наличие &lt;span style="color: #b45f06;"&gt;cgi-handler&lt;/span&gt;, т.е. скрипта, который «пропускает» через себя все запросы проходящие через CGI окружение и перенаправляет их к &lt;b&gt;HTML::Mason&lt;/b&gt; для дальнейшей работы. До сих пор вроде бы всё ясно; теперь несколько замечаний о святая-святых &lt;b&gt;HTML::Mason&lt;/b&gt;, а именно об &lt;span style="color: #990000;"&gt;auto-&lt;/span&gt; и &lt;span style="color: #990000;"&gt;dhandler&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;В общем и целом, их работа (равно как и содержимое) неизменны, но поскольку то, что в &lt;b&gt;CGI &lt;/b&gt;называется &lt;b&gt;&lt;span style="color: #bf9000;"&gt;%ENV&lt;/span&gt;&lt;/b&gt;, а в &lt;b&gt;HTML::Mason&lt;/b&gt;  - &lt;b&gt;&lt;span style="color: #bf9000;"&gt;%ARGS&lt;/span&gt;&lt;/b&gt; (а оно не только называется, но и в самом деле суть две большие разницы) является универсальными контейнерами для обмена данными через переменные окружения (а, как известно mod_perl очень плотно трётся с Apache, а не с &lt;b&gt;CGI&lt;/b&gt;, что и выросло у &lt;b&gt;HTML::Mason&lt;/b&gt;), то неплохо было бы сказать &lt;b&gt;HTML::Mason&lt;/b&gt; откуда их брать, не так ли?&lt;br /&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;&lt;h3&gt;Теория, которая витает в воздухе&lt;/h3&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;В теории, или точнее в документации, говорится, что &lt;b&gt;autohandler&lt;/b&gt; срабатывает прежде всего другого и всегда, а &lt;b&gt;dhandler&lt;/b&gt; только в случае... ну, вообщем, это известно всем. Как оказывается на практике, в &lt;b&gt;CGI&lt;/b&gt; окружении поведение этих рабочих лошадок &lt;b&gt;HTML::Mason&lt;/b&gt; несколько иное. Оказывается, что в таких условиях &lt;b style="color: #bf9000;"&gt;dhandler&lt;/b&gt;, если всё оставить согласно документации, просто не срабатывает тогда, когда надо; хотя &lt;b style="color: #bf9000;"&gt;autohandler&lt;/b&gt; работает без проблем.&lt;br /&gt;&lt;br /&gt;В чём же дело? Собака зарыта в том, как принудительно завести &lt;b style="color: #38761d;"&gt;dhandler&lt;/b&gt;; это значит, каким образом «вкинуть» его в &lt;b&gt;CGI&lt;/b&gt;. Несмотря на то, что данный пример такого проброса не претендует на звание идеального, но там, где не требуется обработка 1000 одновременных запросов, он справляется вполне достойно. Вот рецепт:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;#!/usr/bin/perl&lt;br /&gt;#Файл: mason_handler.cgi ( cgi handler для обработки компонент, auto-, dhandler’a )&lt;br /&gt;use HTML::Mason::CGIHandler;&lt;br /&gt;use lib '/path/to/lib ';  # Абсолютный путь к библиотекам Ваших модулей&lt;br /&gt;use YourModule1;    # Ваш модуль1&lt;br /&gt;use YourModule2;    # Ваш модуль2&lt;br /&gt;use utf8;&lt;br /&gt;&lt;br /&gt;# Установка для принудительного вызова dhandler&lt;br /&gt;$ENV{PATH_INFO} = '/path/to/DocumentRoot/dhandler';&lt;br /&gt;&lt;br /&gt;my $h = HTML::Mason::CGIHandler-&amp;gt;new(&lt;br /&gt;  data_dir   =&amp;gt; '/path/to/mason data dir',&lt;br /&gt;  comp_root =&amp;gt; '/path/to/component/root',&lt;br /&gt;  allow_globals =&amp;gt; [qw($globalscalar)],&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;$h-&amp;gt;handle_request;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Что ещё надо было бы сказать про HTML::Mason&lt;/h3&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;Данный раздел помещён здесь далеко не случайно, а скорее как «крик души». Наверное, многие разработчики, которые имеют работы с неанглоязычными данными сталкивались с различного рода казусами ввода-вывода и последующего отображения языков, отличных от английского.&lt;br /&gt;Начнём с классики, которая в данном случае представляется &lt;b&gt;UTF-8&lt;/b&gt;. В теории (perlunicode, etc) говорится о встроенных классах символов типа “&lt;span style="color: #e69138;"&gt;\p{InBasinLatin}&lt;/span&gt;”, “&lt;span style="color: #e69138;"&gt;\p{InCyrillic}&lt;/span&gt;” и так далее, которые в связке с оператором ‘&lt;span style="color: #e69138;"&gt;qr()&lt;/span&gt;’ могут, и действительно делают, чудеса. Также нелишним будет вспомнить и старушку ‘&lt;span style="color: #e69138;"&gt;quotemeta()&lt;/span&gt;’, которая и сейчас бывает полезной; однако, когда дело доходит до использования всего этого добра в &lt;b&gt;HTML::Mason&lt;/b&gt;, то всё оказывается не так гладко.&lt;br /&gt;&lt;br /&gt;Приведём пример: у вас есть таблица &lt;b&gt;mysql&lt;/b&gt;, которую вы используюте исключительно с ‘&lt;b&gt;&lt;span style="color: #e06666;"&gt;SET NAMES utf8&lt;/span&gt;&lt;/b&gt;’ (ну, чтобы попроще было со смешанными текстами и сборными страницами) и которая также сама имеет там, где надо ‘&lt;b&gt;&lt;span style="color: #e06666;"&gt;CHARSET=utf8 COLLATE=utf8_unicode_ci&lt;/span&gt;&lt;/b&gt;’; затем, вам где-то в форме у пользователя надо бы «почистить» ввод с помощью всеми любимой ‘&lt;b&gt;&lt;span style="color: #e69138;"&gt;s///go&lt;/span&gt;&lt;/b&gt;’ (само собой разумеется, что у вас все страницы содержат валидный &lt;b&gt;XHTML &lt;/b&gt;с мета-тэгом ‘&lt;span style="color: #6aa84f;"&gt;charset=utf-8&lt;/span&gt;’, указанным явно или через ‘&lt;span style="color: #e69138;"&gt;headers_out()&lt;/span&gt;’ от &lt;b&gt;HTML::Mason&lt;/b&gt;), но почему-то «очистка» не работает как надо! Вы лихорадочно пытаетесь задействовать, опять же согласно стандартной документации &lt;b&gt;Perl&lt;/b&gt;, до боли знакомую прагму ‘&lt;span style="color: #b45f06;"&gt;utf8&lt;/span&gt;’ прямо в компоненте... теперь с регулярными выражениями всё, кажется, в порядке, но при этом как-то странно выглядит контент на сборной странице. Вот вроде бы появился свет в конце туннеля, вы «находите» спасительный модуль Encode с его “&lt;span style="color: #b45f06;"&gt;decode(), encode()&lt;/span&gt;” и пытаетесь «нормализовать» входные данные, поступающие прямо из формы... Результат тот же, и не тот, что надо.&lt;br /&gt;&lt;br /&gt;Возможно, ваша собственная история несколько иная, но мораль сей байки такова: все данные, которые соответствуют &lt;b&gt;UTF8&lt;/b&gt;, во внутреннем представлении &lt;b&gt;Perl &lt;/b&gt;практически всегда отличаются от приходящих из интерфейса; единственное назначение такой формы данных, хотя справедливости ради надо сказать, что они вполне пригодны для отображения в &lt;b&gt;браузере&lt;/b&gt;, это скармливание их регулярным выражениям, которые, в свою очередь, если составлены верно, с радостью их обработают в таком виде и выдадут вам правильный (читай – ожидаемый) результат. Во всех же остальных местах вашего драгоценного ресурса их никогда нельзя выпускать «на волю», в противном случае, будет беда: явное включение &lt;b&gt;UTF8 &lt;/b&gt;каким-либо образом хотя бы в одной из компонент &lt;b&gt;HTML::Mason&lt;/b&gt; приводит к тому, что данные из этой компоненты отображаются правильно, а все остальные, как в нашем случае со сборной страницей, будет «не так».&lt;br /&gt;&lt;br /&gt;Проблема обрела форму, но где же решение? Здесь также нелишне вернуться к первоисточникам: там настоятельно советуют следовать старому принципу – «разделяй и властвуй», что в применении к настоящей проблеме можно перефразировать следующим образом. Все процедуры, которые требуют сугубо юникодовской трактовки данных при обработке исключительно средствами языка &lt;b&gt;Perl&lt;/b&gt;, должны находиться только в модулях, а не в компонентах; там же можно использовать инструменты, подобные &lt;span style="color: #b45f06;"&gt;Encode::encoded/decoded(“uf8”, $datum)&lt;/span&gt;. Это одно из, слава нашему Богу, немногих ограничений при планировании приложений, разрабатываемых с помощью &lt;b&gt;HTML::Mason&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Это всё было «внутри», теперь же несколько слов про то, что возможно сделать «снаружи». В &lt;b&gt;HTML::Mason&lt;/b&gt; имеются встроенные &lt;span style="color: #134f5c;"&gt;*escape* &lt;/span&gt;функции; не стоит, наверное, цитировать авторов, надо лишь сделать несколько замечаний относительно вещей, подобных ‘&lt;span style="color: #b45f06;"&gt;|h&lt;/span&gt;’.&lt;br /&gt;На самом деле, если у Вас англоязычный ресурс, то повода для беспокойств нет. Однако в противном случае, если Вы используете кодировку &lt;b&gt;&lt;span style="color: #3d85c6;"&gt;unicode (utf8)&lt;/span&gt;&lt;/b&gt;, следующий код поможет решить проблему с организацией литерального представления данных пользователя. Это нужно, например, тогда, когда на Вашем ресурсе пользователи осуществляют ввод посредством html form. Если пользователи введут данные вместе с &lt;b&gt;HTML &lt;/b&gt;– тэгами, тогда при отображении этих данных, чтобы не нарушился интерфейс ресурса нелишним будет следующее:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;Файл: autohandler&lt;br /&gt;……&lt;br /&gt;% $m-&amp;gt;interp-&amp;gt;set_escape( h =&amp;gt; \&amp;amp;HTML::Mason::Escapes::basic_html_escape );&lt;br /&gt;% $m-&amp;gt;call_next();&lt;br /&gt;……&lt;br /&gt;&lt;br /&gt;Файл: &amp;lt;Ваша компонента&amp;gt;&lt;br /&gt;……&lt;br /&gt;&amp;lt;% $htmlstring | h %&amp;gt;&lt;br /&gt;……&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Пример сборки ресурса&lt;/h3&gt;&lt;h3&gt;&amp;nbsp;&lt;/h3&gt;Здесь мы хотели бы проиллюстрировать на простом примере всё, о чём было сказано выше.&lt;br /&gt;В данном примере мы создаём небольшой ресурс, составными частями которого будут:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;модуль, основным назначением которого будет сопряжение с &lt;b&gt;БД&lt;/b&gt;;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #b45f06;"&gt;autohandler &lt;/span&gt;и &lt;span style="color: #b45f06;"&gt;dhandler&lt;/span&gt;&lt;/li&gt;&lt;li&gt;набор компонент для сборки нехитрого интерфейса.&lt;/li&gt;&lt;/ul&gt;Замечания и комментарии будут даваться по ходу представления исходного кода ресурса.&lt;br /&gt;Пример приложения можно скачать &lt;a href="http://blog.seeuse.com/download/example.zip"&gt;здесь&lt;/a&gt; (~ 10 Kb).&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-4901046917098568949?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/4901046917098568949/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/10/perl-htmlmason.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/4901046917098568949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/4901046917098568949'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/10/perl-htmlmason.html' title='Perl :: Мифы и реальность с HTML::Mason'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-5094470428008021319</id><published>2009-10-26T06:05:00.000-07:00</published><updated>2009-10-26T06:15:41.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='on English'/><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='article'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='статья'/><title type='text'>Perl :: Unicode and regular expressions</title><content type='html'>To paraphrase a famous French thinker and in connection to &lt;b&gt;Perl&lt;/b&gt; it is trustworthy to say: "If there would not exist &lt;span style="background-color: #6aa84f;"&gt;regular expressions&lt;/span&gt;, there would not be &lt;b&gt;Perl&lt;/b&gt;". Perhaps, &lt;a href="http://en.wikipedia.org/wiki/Larry_Wall"&gt;Larry Wall&lt;/a&gt; would disagree, but none could neglect the importance of regular expressions for Perl mongers (or, may be, vice versa); anyway, it is not almost possible to find a perl programmer who does not use regexp ever (otherwise, the one does not use Perl at all, we suppose).&lt;br /&gt;&lt;br /&gt;There is a huge lot of data on &lt;b&gt;Perl's&lt;/b&gt; &lt;span style="color: #38761d;"&gt;regular expressions&lt;/span&gt; out there, but of course the real leader is 'Mastering Regular Expressions' by J. Friedl, worthy to read, worthy to disagree and, after all, worthy to learn. The issues we're going in for here are covering to some extent &lt;b&gt;Unicode&lt;/b&gt; and how &lt;b&gt;Perl's regexp&lt;/b&gt; can help in handling something with it.&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #a64d79;"&gt;FYI: perldoc perlunicode - Perl Unicode support&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To do one's homework the right way, he has to get some confident understanding (based mostly on his own experience, of course) of how regular expressions work and especially the parts related to building regexp objects and the embedded code, that is during matching or substitution to dynamically execute some piece of Perl code inside &lt;span style="color: #b45f06;"&gt;m//&lt;/span&gt; or &lt;span style="color: #b45f06;"&gt;s///&lt;/span&gt;. It would be nice if the reader has gotten already some experience in Unicode and there won't be necessary to remind him that under '&lt;span style="color: #b45f06;"&gt;use utf8&lt;/span&gt;' or '&lt;span style="color: #b45f06;"&gt;use encoding "utf8"&lt;/span&gt;' pragmas it's almost always advisable to add one more - 'use re "eval"' so that to make any snippet within a regexp executable by perl interpreter. Nor to recall such Perl &lt;b&gt;Unicode &lt;/b&gt;ABC notion like behaviour of '&lt;span style="color: #b45f06;"&gt;\w&lt;/span&gt;' in some home-grown alphanumeric class of symbols.&lt;br /&gt;&lt;br /&gt;The last note right before the start: 'use locale', sure, puts the death shadow on the cross-platform design of your applications, especially when there's something like '&lt;span style="color: #b45f06;"&gt;\p{InCyrillic}&lt;/span&gt;' or '&lt;span style="color: #b45f06;"&gt;\p{InCJKCompatibilityIdeographs}&lt;/span&gt;' because beasts like these are getting extremely sensitive in regular expressions to locale settings and '&lt;span style="color: #b45f06;"&gt;use bytes&lt;/span&gt;' and '&lt;span style="color: #b45f06;"&gt;no bytes&lt;/span&gt;' contexts.&lt;br /&gt;FYI: perldoc utf8  - Perl pragma to enable/disable &lt;b&gt;UTF-8&lt;/b&gt; (or &lt;b&gt;UTF-EBCDIC&lt;/b&gt;) in source code&lt;br /&gt;In order to do away with the introduction let's refresh a row of basic functions that can be of a good help in baking and stuffing some Unicodish frameworks:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;our ( @packed, );&lt;br /&gt;@packed = map{chr($_)} (0x4E00 .. 0x9FFF);&lt;br /&gt;print $_, "\n" for @packed[0 .. 9];&lt;br /&gt;exit(0);&lt;/pre&gt;this short and speedy 'CJK character generator' is able to give birth to more than 20 000 characters in no time, that one can find in Chinese, Japanese, Korean and, probably, in the old Vietnamese. The line:&lt;br /&gt;&lt;pre class="sh_perl"&gt;@packed = map{chr($_)} (0x4E00 .. 0x9FFF);&lt;/pre&gt;may be seamlessly replaced with something like following:&lt;br /&gt;&lt;pre class="sh_perl"&gt;@packed = map{pack 'U', $_} (0x4E00 .. 0x9FFF);&lt;/pre&gt;&lt;br /&gt;for this '&lt;span style="color: #b45f06;"&gt;pack&lt;/span&gt;' and '&lt;span style="color: #b45f06;"&gt;chr&lt;/span&gt;' are interchangable, no doubt.&lt;br /&gt;Now let's do some matching job. The job should be effective enough without any temporary variables that take a significant piece of memory; in other words, we have to make use of Perl's built-ins. Again, let's take some Chinese string as a sample due to a good amount of &lt;b&gt;Unicode &lt;/b&gt;codepoints devoted to this language:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use utf8;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;our ( $re, $sample );&lt;br /&gt;$re = qr{(&lt;br /&gt;        [\p{InCJKUnifiedIdeographs}] |&lt;br /&gt;        [\p{InCJKCompatibility}] |&lt;br /&gt;        [\p{InCJKCompatibilityForms}] |&lt;br /&gt;        [\p{InCJKRadicalsSupplement}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographsSupplement}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionA}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographs}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionB}])}ox;&lt;br /&gt;&lt;br /&gt;$sample = '五行: 一曰水, 二曰火, 三曰木, 四曰金, 五曰土 &lt;br /&gt;  пять стихий: первая называется вода, &lt;br /&gt;  вторая — огонь, третья — дерево, &lt;br /&gt;  четвёртая — металл, &lt;br /&gt;  пятая — земля Five Elements: first is Water, &lt;br /&gt;  second is Fire, third is Wood, fourth is Metal, fifth is Earth';&lt;br /&gt;while($sample =~ m/$re/g)&lt;br /&gt;{&lt;br /&gt;    print $1,"\n";&lt;br /&gt;}&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;As one can see the sample consists of three languages, from which Perl carefully has chosen, one by one, (as it was said to him) those of &lt;b&gt;CJK &lt;/b&gt;family. For those who has forgotten what kind of Latin bull is placed right after '$re' regexp object, we advise to go to 'perldoc perlre' listed in Perl pod; and for those Perl critters, who likes to know everything about anything we've got few questions: (1) where did &lt;b&gt;Perl &lt;/b&gt;get the value for '&lt;span style="color: #b45f06;"&gt;$1&lt;/span&gt;' variable? (2) what's the difference between '&lt;span style="color: #b45f06;"&gt;use utf8&lt;/span&gt;' and '&lt;span style="color: #b45f06;"&gt;use encoding "utf8"&lt;/span&gt;'? (actually, why both of them are here?!) (3) why '&lt;span style="color: #b45f06;"&gt;ox&lt;/span&gt;' and '&lt;span style="color: #b45f06;"&gt;g&lt;/span&gt;' regexp modifiers are separated here? In case you've got all answers ready at once, you're the best!&lt;br /&gt;&lt;br /&gt;It is the right time to bring in more dynamical pictures, that is, to breathe some spirit into &lt;b&gt;regular expressions&lt;/b&gt;. Check this:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use utf8;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;use re 'eval';&lt;br /&gt;our ( $re, $index, $num, $line, $key1, &lt;br /&gt;                                $key2, @estimate, @over, @under, %got, );&lt;br /&gt;$re = qr{(&lt;br /&gt;        [\p{InCJKUnifiedIdeographs}] |&lt;br /&gt;        [\p{InCJKCompatibility}] |&lt;br /&gt;        [\p{InCJKCompatibilityForms}] |&lt;br /&gt;        [\p{InCJKRadicalsSupplement}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographsSupplement}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionA}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographs}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionB}])}ox;&lt;br /&gt;@over       = qw(估計過高 переоценивать overestimate);&lt;br /&gt;@under      = qw(估計過低 недооценивать underestimate);&lt;br /&gt;@estimate   = (@over, @under);&lt;br /&gt;$index = $num = 0;&lt;br /&gt;grep{&lt;br /&gt;        $num++;&lt;br /&gt;        ($line) = $_;&lt;br /&gt;        $got{$num}{s/$re/$index++/e} = $line if(/$re/);&lt;br /&gt;    } @estimate;&lt;br /&gt;foreach $key1 ( sort {$a &amp;lt;=&amp;gt; $b} keys %got )&lt;br /&gt;{&lt;br /&gt;    print "\n\nelement number:\t", $key1, "\n";&lt;br /&gt;    foreach $key2 ( sort {$a &amp;lt;=&amp;gt; $b} keys %{ $got{ $key1 } } )&lt;br /&gt;    {&lt;br /&gt;                  print "match number: \t", $key2, "\t",  &lt;br /&gt;                     $got{ $key1 }{ $key2 }, "\n";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;The script possesses some redundancy, but this is for teaching purposes only and produces no performance hits: just benchmark anything similar with seen-so-often&lt;span style="color: #0b5394;"&gt; if/else &lt;/span&gt;branching and measure the time. What's special on these 40 and something lines? There are two things deserving your, dear reader, attention:&lt;br /&gt;(1) using '&lt;span style="color: #b45f06;"&gt;our&lt;/span&gt;'; as you probably noticed, neither passing, nor returning any "&lt;span style="color: #38761d;"&gt;parameters&lt;/span&gt;" are present. There exists from the very beginning a hash '&lt;span style="color: #b45f06;"&gt;%got&lt;/span&gt;', which is what every line of the script is using in turn;&lt;br /&gt;(2) there's a conditional increment for '&lt;span style="color: #b45f06;"&gt;$index&lt;/span&gt;', which is what gives the matched subscript numbers to get back to the source array if needed.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Another way of thinking regexp like way is to use the embedded code; it looks very much alike the thing described above, however, it is not only a different flavour of using regular expressions, but also another way of building conditions while matching:&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;pre class="sh_perl"&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use utf8;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;use re 'eval';&lt;br /&gt;our ( $re, $index, $num, $sample1, &lt;br /&gt;         $sample2, $sample3, %src, %got, );&lt;br /&gt;$re = qr{(&lt;br /&gt;        [\p{InCJKUnifiedIdeographs}] |&lt;br /&gt;        [\p{InCJKCompatibility}] |&lt;br /&gt;        [\p{InCJKCompatibilityForms}] |&lt;br /&gt;        [\p{InCJKRadicalsSupplement}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographsSupplement}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionA}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographs}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionB}])}ox;&lt;br /&gt;$sample1    = q[一萬一千一百一十一 11111];&lt;br /&gt;$sample2    = q[天一地二天三地四 &lt;br /&gt;  небу соответствует число один, &lt;br /&gt;  земле — два, небу— три, земле — четыре... (и т. д.; «Ицзин») &lt;br /&gt;  one belongs to the Heaven, &lt;br /&gt;  two belongs to the Earth, &lt;br /&gt;  three belongs to the Heaven, &lt;br /&gt;  four belongs to the Earth... (etc, "YiJing")];&lt;br /&gt;$sample3    =q[道生一, 一生二, 二生三, 三生萬物 &lt;br /&gt;  Дао рождает одно (нерасчленённое единство), &lt;br /&gt;  одно рождает два (раздвоенность), &lt;br /&gt;  два рождает три (триаду), &lt;br /&gt;  от трёх рождаются все существа (вещи) &lt;br /&gt;  Dao bears one (indivisible unity), &lt;br /&gt;  one gives birth to the two (duality), &lt;br /&gt;  two produces three (triad), &lt;br /&gt;  those three flood everything (all things in the world)];&lt;br /&gt;grep{ $src{$index++} = $_} ($sample1, $sample2, $sample3);&lt;br /&gt;grep{&lt;br /&gt;    grep{&lt;br /&gt;            m#($re) ? (??{$got{$_}++ if($1 ne '')})#cgx;&lt;br /&gt;        } split //, $src{$_};&lt;br /&gt;    } sort keys %src;&lt;br /&gt;foreach $num ( keys %got )&lt;br /&gt;{&lt;br /&gt;         print 'the match: ', "\t", $num, ' was seen:', "\t",  &lt;br /&gt;           $got{ $num }, " time(s)\n";&lt;br /&gt;}&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;Building '&lt;span style="color: #b45f06;"&gt;%src&lt;/span&gt;' is artificial here, but in real life hashes can do a lot of useful job and the extreme of such usefulness is a transparency of hash use through the whole script. Another interesting point is the way '&lt;span style="color: #b45f06;"&gt;split&lt;/span&gt;' treats strings, because it really splits strings with &lt;b&gt;Unicode &lt;/b&gt;in mind. One can find more things like this, for example: &lt;span style="color: #0b5394;"&gt;cho(m)p&lt;/span&gt;; but be aware: not everything is smooth in this respect - just try to play with '&lt;span style="color: #b45f06;"&gt;use/no bytes&lt;/span&gt;' and '&lt;span style="color: #b45f06;"&gt;length&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-5094470428008021319?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/5094470428008021319/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/10/perl-unicode-and-regular-expressions.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/5094470428008021319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/5094470428008021319'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/10/perl-unicode-and-regular-expressions.html' title='Perl :: Unicode and regular expressions'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-7714614112279145178</id><published>2009-10-23T07:28:00.000-07:00</published><updated>2009-10-26T02:35:45.658-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='на русском'/><title type='text'>Perl :: Юникод и регулярные выражения</title><content type='html'>&amp;nbsp;&amp;nbsp; Перефразируя известного французского мыслителя применительно к &lt;b&gt;Perl&lt;/b&gt; вполне справедливо заметить: «Если бы не существовало регулярных выражений, то не было бы и языка &lt;b&gt;Perl&lt;/b&gt;». Возможно, &lt;a href="http://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D1%80%D1%80%D0%B8_%D0%A3%D0%BE%D0%BB%D0%BB"&gt;Лари Уолл&lt;/a&gt; и не согласился бы с данным утверждением, но никто, наверное, не осмелился бы оспаривать важность регулярных выражений для приверженцев этого языка (обратное, вероятней всего, также верно). Как бы там ни было, но, согласитесь, тяжело найти &lt;b&gt;Perl&lt;/b&gt; программиста, который бы не использовал &lt;span style="background-color: #93c47d;"&gt;регулярных выражений&lt;/span&gt; (а иначе, он попросту не использует его).&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Существует множество ресурсов по регулярным выражениям, но неоспоримым лидером, конечно же, является 'Mastering Regular Expressions' Дж. Фридла, которую стоит прочитать, с которой стоит не соглашаться и, в конце концов, по которой стоит учиться. Ряд вопросов, которые здесь будут затронуты, касаются в определённой степени самого Юникода, как явления необычайно важного, и то, как регулярные выражения в Perl могут помочь в их решении.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: #674ea7;"&gt;FYI: perldoc perlunicode - Perl Unicode support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Чтобы быть достаточно подготовленным для прочтения данного материала читатель должен уверенно себя чувствовать в вопросах работы регулярных выражений и особенно в части, которая касается построения объектов регулярных выражений; а также, как внедрять исполняемый код в регулярные выражения в ходе замены или при поиске совпадений, чтобы динамически выполнять куски кода внутри &lt;span style="color: #b45f06;"&gt;m//&lt;/span&gt; или &lt;span style="color: #b45f06;"&gt;s///&lt;/span&gt;. Было бы неплохо, если бы читатель уже имел некоторый опыт работы с &lt;b&gt;Юникодом&lt;/b&gt; и знал его организацию, и что при использовании всех вышеупомянутых предметов необходимо использовать '&lt;span style="color: #b45f06;"&gt;use utf8&lt;/span&gt;' либо '&lt;span style="color: #b45f06;"&gt;use encoding "utf8"&lt;/span&gt;' вместе с ещё одной прагмой - '&lt;span style="color: #b45f06;"&gt;use re "eval"&lt;/span&gt;', которая разрешает внедрять исполняемый код в регулярные выражения. Всё это, естественно, само собой подразумевает, что читатель знаком с поведением '&lt;span style="color: #b45f06;"&gt;\w&lt;/span&gt;' в среде &lt;b&gt;Юникода&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; И последнее перед тем, как приступить к повествованию: '&lt;span style="color: #b45f06;"&gt;use locale&lt;/span&gt;' накладывает гранитную глыбу на &lt;b&gt;кросс-платформенность&lt;/b&gt; ваших приложений, в особенности, когда у вас присутствует что-то типа '&lt;span style="color: #b45f06;"&gt;\p{InCyrillic}&lt;/span&gt;' или '&lt;span style="color: #b45f06;"&gt;p{InCJKCompatibilityIdeographs}&lt;/span&gt;', поскольку эти «звери» становятся чрезвычайно чувствительны к настройкам системы в &lt;b&gt;регулярных выражениях&lt;/b&gt; и в контекстах '&lt;span style="color: #b45f06;"&gt;use bytes&lt;/span&gt;' и '&lt;span style="color: #b45f06;"&gt;no bytes&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #a64d79;"&gt; FYI: perldoc utf8  - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Чтобы покончить с введением, давайте освежим в памяти несколько базовых функций, которые могут помочь в наполнении вакуума о &lt;b&gt;Юникоде&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;our ( @packed, );&lt;br /&gt;@packed = map{chr($_)} (0x4E00 .. 0x9FFF);&lt;br /&gt;print $_, "\n" for @packed[0 .. 9];&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;этот малыш может сгенерировать практически мгновенно более &lt;b&gt;20.000 иероглифов&lt;/b&gt;, которые используются в &lt;b style="color: #cc0000;"&gt;китайском&lt;/b&gt;, &lt;b&gt;японском&lt;/b&gt;, &lt;b&gt;корейском&lt;/b&gt; и, возможно, в &lt;b&gt;старо-вьетнамском&lt;/b&gt; языках. Строка:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;@packed = map{chr($_)} (0x4E00 .. 0x9FFF);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;может быть совсем безболезненно переписана как:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;@packed = map{pack 'U', $_} (0x4E00 .. 0x9FFF);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Здесь функции '&lt;span style="color: #b45f06;"&gt;pack&lt;/span&gt;' и '&lt;span style="color: #b45f06;"&gt;chr&lt;/span&gt;' несомненно взаимозаменяемы.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Теперь попробуем сделать что-либо более полезное. Поскольку &lt;b&gt;Perl&lt;/b&gt; сам имеет встроенную поддержку &lt;b&gt;Юникода&lt;/b&gt; нам не понадобится даже создание временных переменных и мы сможем сразу перейти к созданию нужных нам объектов &lt;b&gt;регулярных выражений&lt;/b&gt;. Если у кого-либо из читателей возникнет вопрос по поводу присутствия китайских предложений, то можно ответить, что это потому, что постольку данный язык (а точнее CJK) имеет наибольшее присутствие в &lt;b&gt;Юникоде&lt;/b&gt; в виде символов:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use utf8;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;our ( $re, $sample );&lt;br /&gt;$re = qr{(&lt;br /&gt;        [\p{InCJKUnifiedIdeographs}] |&lt;br /&gt;        [\p{InCJKCompatibility}] |&lt;br /&gt;        [\p{InCJKCompatibilityForms}] |&lt;br /&gt;        [\p{InCJKRadicalsSupplement}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographsSupplement}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionA}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographs}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionB}])}ox;&lt;br /&gt;&lt;br /&gt;$sample = '五行: 一曰水, 二曰火, 三曰木, 四曰金, 五曰土 &lt;br /&gt;  пять стихий: первая называется вода, &lt;br /&gt;  вторая — огонь, третья — дерево, &lt;br /&gt;  четвёртая — металл, пятая — земля &lt;br /&gt;  Five Elements: first is Water, second is Fire, &lt;br /&gt;  third is Wood, fourth is Metal, fifth is Earth';&lt;br /&gt;&lt;br /&gt;while($sample =~ m/$re/g)&lt;br /&gt;{&lt;br /&gt;    print $1,"\n";&lt;br /&gt;}&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;очевидно, что в примере используются строки-образцы, содержащие текст на трёх языках и &lt;b&gt;Perl&lt;/b&gt; совершенно точно (как и было ему велено) выбрал лишь те, которые принадлежат группе CJK.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Для тех, кому не понятно присутствие латинского «быка» в конце объекта &lt;b&gt;регулярного выражения&lt;/b&gt;, мы рекомендуем обратиться к '&lt;span style="color: #b45f06;"&gt;perldoc perlre&lt;/span&gt;'; ну, а для тех «книжных червей», которые желают знать всё обо всём, имеется несколько вопросов:&lt;br /&gt;(1) откуда берётся значение для '&lt;span style="color: #b45f06;"&gt;$1&lt;/span&gt;'?&lt;br /&gt;(2) в чём разница между '&lt;span style="color: #b45f06;"&gt;use utf8&lt;/span&gt;' и '&lt;span style="color: #b45f06;"&gt;use encoding "utf8"&lt;/span&gt;'? (то есть, точнее, почему они обе здесь?)&lt;br /&gt;(3) почему модификаторы '&lt;span style="color: #b45f06;"&gt;ox&lt;/span&gt;' и '&lt;span style="color: #b45f06;"&gt;g&lt;/span&gt;' здесь разделены? Если у Вас готовы ответы на все эти вопросы, мы все как один снимаем перед Вами шляпы!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Настало время прибавить газу, или внести больше динамики в наши иллюстрации к регулярным выражениям. Взгляните на это:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use utf8;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;use re 'eval';&lt;br /&gt;our ( $re, $index, $num, $line, $key1, $key2, &lt;br /&gt;  @estimate, @over, @under, %got, );&lt;br /&gt;&lt;br /&gt;$re = qr{(&lt;br /&gt;        [\p{InCJKUnifiedIdeographs}] |&lt;br /&gt;        [\p{InCJKCompatibility}] |&lt;br /&gt;        [\p{InCJKCompatibilityForms}] |&lt;br /&gt;        [\p{InCJKRadicalsSupplement}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographsSupplement}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionA}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographs}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionB}])}ox;&lt;br /&gt;&lt;br /&gt;@over       = qw(估計過高 переоценивать overestimate);&lt;br /&gt;@under      = qw(估計過低 недооценивать underestimate);&lt;br /&gt;@estimate   = (@over, @under);&lt;br /&gt;$index = $num = 0;&lt;br /&gt;grep{&lt;br /&gt;        $num++;&lt;br /&gt;        ($line) = $_;&lt;br /&gt;        $got{$num}{s/$re/$index++/e} = $line if(/$re/);&lt;br /&gt;    } @estimate;&lt;br /&gt;foreach $key1 ( sort {$a &amp;lt;=&amp;gt; $b} keys %got )&lt;br /&gt;{&lt;br /&gt;    print "\n\nelement number:\t", $key1, "\n";&lt;br /&gt;    foreach $key2 ( sort {$a &amp;lt;=&amp;gt; $b} keys %{ $got{ $key1 } } )&lt;br /&gt;    {&lt;br /&gt;                print "match number: \t", $key2, "\t",  &lt;br /&gt;                $got{ $key1 }{ $key2 }, "\n";&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;в скрипте присутствует определённая избыточность, но это исключительно в образовательных целях и, к тому же, в данном случае это никоим образом не влияет на КПД: попробуйте изобразить что-то типа этого, используя &lt;span style="color: #0b5394;"&gt;if/else&lt;/span&gt; управляющие структуры и сравните время выполнения. Что особенного в этих сорока строках? Есть пару вещей, которые заслуживают внимания:&lt;br /&gt;&lt;br /&gt;(1)использование '&lt;span style="color: #b45f06;"&gt;our&lt;/span&gt;'; как вы уже заметили, даёт возможность не передавать и не принимать никаких данных: всё решается за счёт создания хэша '&lt;span style="color: #b45f06;"&gt;%got&lt;/span&gt;', который программа вызывает и использует там, где надо;&lt;br /&gt;&lt;br /&gt;(2)имеется инкремент счётчика '&lt;span style="color: #b45f06;"&gt;$index&lt;/span&gt;' по условию, который и возвращает номера элементов, отвечающих условию совпадения.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Другим способом подобного мышления является использование внедрённого кода; несмотря на то, что это выглядит примерно так, как и выше, но это не только иной вариант применения регулярных выражений, а иной способ построения условий, которые внедряются в них:&lt;br /&gt;&lt;br /&gt;&lt;pre class="sh_perl"&gt;&lt;br /&gt;#!/usr/bin/perl&lt;br /&gt;use strict;&lt;br /&gt;use utf8;&lt;br /&gt;use encoding 'utf8';&lt;br /&gt;use re 'eval';&lt;br /&gt;our ( $re, $index, $num, $sample1, $sample2, &lt;br /&gt;   $sample3, %src, %got, );&lt;br /&gt;&lt;br /&gt;$re = qr{(&lt;br /&gt;        [\p{InCJKUnifiedIdeographs}] |&lt;br /&gt;        [\p{InCJKCompatibility}] |&lt;br /&gt;        [\p{InCJKCompatibilityForms}] |&lt;br /&gt;        [\p{InCJKRadicalsSupplement}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographsSupplement}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionA}] |&lt;br /&gt;        [\p{InCJKCompatibilityIdeographs}] |&lt;br /&gt;        [\p{InCJKUnifiedIdeographsExtensionB}])}ox;&lt;br /&gt;&lt;br /&gt;$sample1    = q[一萬一千一百一十一 11111];&lt;br /&gt;$sample2    = q[天一地二天三地四 &lt;br /&gt;  небу соответствует число один, &lt;br /&gt;  земле — два, небу— три, &lt;br /&gt;  земле — четыре... (и т. д.; «Ицзин») &lt;br /&gt;  one belongs to the Heaven, &lt;br /&gt;  two belongs to the Earth, &lt;br /&gt;  three belongs to the Heaven, &lt;br /&gt;  four belongs to the Earth... (etc, "YiJing")];&lt;br /&gt;$sample3    =q[道生一, 一生二, 二生三, 三生萬物 &lt;br /&gt;  Дао рождает одно (нерасчленённое единство), &lt;br /&gt;  одно рождает два (раздвоенность), &lt;br /&gt;  два рождает три (триаду), &lt;br /&gt;  от трёх рождаются все существа (вещи) &lt;br /&gt;  Dao bears one (indivisible unity), &lt;br /&gt;  one gives birth to the two (duality), &lt;br /&gt;  two produces three (triad), &lt;br /&gt;  those three flood everything (all things in the world)];&lt;br /&gt;&lt;br /&gt;grep{ $src{$index++} = $_} ($sample1, $sample2, $sample3);&lt;br /&gt;&lt;br /&gt;grep{&lt;br /&gt;    grep{&lt;br /&gt;            m#($re) ? (??{$got{$_}++ if($1 ne '')})#cgx;&lt;br /&gt;        } split //, $src{$_};&lt;br /&gt;    } sort keys %src;&lt;br /&gt;&lt;br /&gt;foreach $num ( keys %got )&lt;br /&gt;{&lt;br /&gt;         print 'the match: ', "\t", $num, ' was seen:', "\t",  &lt;br /&gt;              $got{ $num }, " time(s)\n";&lt;br /&gt;}&lt;br /&gt;exit(0);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Построение &lt;b&gt;хэша&lt;/b&gt; '&lt;span style="color: #b45f06;"&gt;%src&lt;/span&gt;' является несколько искусственным здесь, если сравнивать с мощью хэшей вообще, и в этом примере как нельзя лучше показан способ применения хэшей, точнее, «прозрачность» их использования через всю программу. Другой интересной точкой является функция '&lt;span style="color: #b45f06;"&gt;split&lt;/span&gt;', которая действительно полностью «понимает» &lt;b&gt;Юникод&lt;/b&gt;. Есть и другие функции с подобным поведением в &lt;b&gt;Юникодовской&lt;/b&gt; среде, например: &lt;span style="color: #073763;"&gt;cho(m)p&lt;/span&gt;; но надо помнить, что не всё гладко в этом отношении. Чтобы понять это попробуйте поиграть с '&lt;span style="color: #b45f06;"&gt;use/no bytes&lt;/span&gt;' и '&lt;span style="color: #b45f06;"&gt;length&lt;/span&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-7714614112279145178?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/7714614112279145178/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/10/perl.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/7714614112279145178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/7714614112279145178'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/10/perl.html' title='Perl :: Юникод и регулярные выражения'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5961960787980289155.post-1471570714454605390</id><published>2009-10-23T00:55:00.000-07:00</published><updated>2009-10-23T02:19:55.830-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='программирование'/><category scheme='http://www.blogger.com/atom/ns#' term='новости'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='статья'/><category scheme='http://www.blogger.com/atom/ns#' term='на русском'/><title type='text'>Всем привет! Команда Unencoded возвращается!</title><content type='html'>&lt;div class="entry"&gt;&lt;div class="snap_preview"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; Этот блог был создан &lt;span style="font-weight: bold;"&gt;для программистов&lt;/span&gt;, однако же как и любой человек в мире, создатели данного сайта также имеют собственные предпочтения; вот, собственно, почему многое из того, что посетители смогут найти здесь, связанно с языком &lt;b&gt;Perl&lt;/b&gt;. Ничего удивительного, ведь этот язык как нельзя лучше подходит для очень многих вещей таких как, огромные массивы текстовых данных (и не только на языках, в которых есть алфавит), либо для разработки распределённых интер- интра- экстранет клиент-серверных многоцелевых приложений; или при выполнении ежедневной рутинной работы по администрированию системы.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_jcxkqbQILvc/SuFxv1b8FyI/AAAAAAAAAC0/RCuxpboxB9U/s1600-h/unencoded-team.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_jcxkqbQILvc/SuFxv1b8FyI/AAAAAAAAAC0/RCuxpboxB9U/s640/unencoded-team.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Несмотря на тот факт, что в наши дни рост числа и качественное развитие прочих языков, таких как C, Ruby, .Net, C#, Java и PHP, &lt;span style="font-weight: bold;"&gt;Perl&lt;/span&gt; остаётся наилучшим выбором, когда, например, дело доходит до использования регулярных выражений или написанию на скорую руку мини-программ в одну строку. Все эти разнородные задачи никоим образом не умаляют его прочих достоинств и роли рабочего Верблюда, (данное замечание не имеет ничего общего с зарегистрированной торговой маркой JT Intl.) у которого, как всем известно, выносливости больше, чем у самой хорошей рабочей лошадки.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Пусть посетителей не смущают такие заголовки тем, как «&lt;b&gt;Переменная&lt;/b&gt;» или «&lt;b&gt;Массивы&lt;/b&gt;» потому, что в повседневной жизни каждый, кто занимается программированием серьёзно, а не от случаю к случаю, сталкивается с проблемами, решение которых большей частью зависит от хорошего понимания основ языка программирования, его базовых структур и понятий; и о которых он уже, возможно, читал в учебниках для начинающих. Достаточно сказать, что решение многих «нерешаемых» проблем часто и густо находится в правильном и обоснованном использовании самых простых «кирпичиков» языка. Наверное, не надо говорить о том, насколько хорошо встроенные типы данных любого языка оптимизированы для конкретных задач, а в целом хочется напомнить, что «всё гениальное – просто».&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; Надо заметить, что всё содержимое данного сайта это не бездумное копирование или конспектирование огромного объёма информации по какому-либо языку, доступное для любого человека, пожелавшего использовать тот или иной язык программирования; а оно (содержимое) суть личного опыта, хотя и существует определённая логика в последовательности изложения в целом. Авторы данного сайта действительно увлечены &lt;b&gt;Perl&lt;/b&gt; и надеются, что рано или поздно также будут способны внести достойную лепту в сокровищницу Сообщества Открытого Кода.&lt;br /&gt;&lt;br /&gt;FYI: (%perldoc) perl – Practical Extraction and Report Language&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Программирование на Perl, веб-сервер Apache, база данных MySQL, идеология AJAX с XML, веб-дизайн, HTML Mason, опытные разработчики&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5961960787980289155-1471570714454605390?l=www.unencoded.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.unencoded.net/feeds/1471570714454605390/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.unencoded.net/2009/10/unencoded.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/1471570714454605390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5961960787980289155/posts/default/1471570714454605390'/><link rel='alternate' type='text/html' href='http://www.unencoded.net/2009/10/unencoded.html' title='Всем привет! Команда Unencoded возвращается!'/><author><name>Ujin</name><uri>http://www.blogger.com/profile/12315505551148982502</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='12644221204950268393'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_jcxkqbQILvc/SuFxv1b8FyI/AAAAAAAAAC0/RCuxpboxB9U/s72-c/unencoded-team.jpg' height='72' width='72'/><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>