LINUX.ORG.RU
ФорумTalks

Изучаю perl


0

2

Сижу, изучаю сабж. Так, для собственного развития. Подумал, что для закрепления навыков необходимо как-то попрактиковаться. Придумал вот такую вещь, которую засунул в .bashrc:

curl -s bash.org.ru/random | iconv -f cp1251 -t utf8 | perl bash.org.pl 

bash.org.pl:

my @mas;
$per=0;
while (<>) {
	if ($per==1) {
		$per=0;
		$_=~s/<[^>]*>//g;
		$_=~s/\&.*;//g;
		$_=~s/^\t+//g;
		@mas=(@mas,$_);
	}
	if ( $_ =~m{^\t\t\t\t\t</div>\n$} ) {
		$per=1;
		}
	
}
srand;
print $mas[int(rand($#mas))];

Сам знаю, что получилось фигово, зато, если потребуется разобраться в коде, не придется особо париться.

★★
Ответ на: комментарий от Dimanc

Гм.

Я забыл про существование realloc. Но realloc это не самое страшное, копировать туда-сюда мегабайты страшнее.

Xellos ★★★★★
()
Ответ на: комментарий от DNA_Seq

Самый нормальный путь изучения перла начинается с постановки задачи. Зачем изучать perl? А после ламы и совы нужно сразу брать и читать хороший код. Чтобы не писать говно.

Xellos ★★★★★
()
Ответ на: комментарий от DNA_Seq

>А нафиг тогда перл? Лучше сразу на питоне писать

Ну блин, если я вдруг попаду в полевой госпиталь, хотелось бы всё же иметь дело с хирургами, которые в чистой больничке учились, а не на скотном дворе.

А таак питон язык приятный, когда буду нормально знать перл — непременно им займусь.

lodin ★★★★
()

Не-не-не. Лучше уж тогда на sed такое писать.
Или если на Perl, то целеком.

Xenius ★★★★★
()
Ответ на: комментарий от dumal

$_=~s/<br>/\n/g;
$_=~s/<[^>]*>//g;
$_=~s/\&\w*;//g;
$_=~s/^\t+//g;

переписывается так

s/(?:<br>/\n|<[^>]*>|\&\w*|^\t+)//g;

а \t\t\t\t\t нагляднее заменить \t{5}

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от lodin

Я боюсь, что на ассемблере он написал строчек на десять больше, чем на перле. Ассемблер учит дисциплине, а в приведённом коде никакой дисциплины нет.

Xellos ★★★★★
()
Ответ на: комментарий от ugoday

регэкспы вещь тормозная by design

И это тоже не верно.

Я бы сказал: «отчасти верно». Большинство реализаций регэкспа сделано крайне топорно или поддерживает такой функционал, который не позволяет сделать эффективную реализацию. Есть очень мало мест, где это сделано правильно, через создание NDFA.

Подробнее можно почитать здесь Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, ...). В свое время для меня эта статья явилась открытием.

Для Java есть открытая библиотека Automaton. В ней имеются и недетерминированные автоматы и возможность создания автоматов по регулярному выражению. Также имеются операции над автоматами - можно собирать сложное регулярное выражение из простых.

Если кому нужна библиотека для C++ - то имеется и такая RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. Эту библиотеку я не пробовал - но судя по описанию это то, что нужно.

sign
()
Ответ на: комментарий от sign

в перле 5.10.х, afaik, сильно изменили движок регекспов… вроде как рекурсии убрали и ещё что-то… узнал из багрепортов, т.к. перл 5.10 начал глючить с некоторыми навороченными регекспами, которые и у меня были… вроде как в 5.11.х/5.12.х пофиксили, но у меня ещё не было возможности потестить…

arsi ★★★★★
()
Ответ на: комментарий от DNA_Seq

Перл это не больница с сотней врачей, скорее это палатка полевой хиругии - быстро и грязно, иначе пациен умрет так и не доехав до больницы

зопейсал

burzumko
()
Ответ на: комментарий от arsi

в перле 5.10.х, afaik, сильно изменили движок регекспов

Отрадно слышать. Но, предполагаю, что улучшить скорость поиска для всех возможных «perl regexp» вряд ли удастся. Хотя, если была улучшена скорость хотя бы большинства «классических regexp» - это было бы хорошо.

Также быстрый поиск дал интересную ссылку на интервью July 13, 2010 O'Reilly interview by Josette Garcia. «Damian Conway on Perl and its future»

Здесь меня поразил следующий фрагмент

The other reason we’ve spent so much time on regexes and parsing is that Perl 5 regexes, which are easily the most powerful and sophisticated in a mainstream language, also now have a near-fatal problem. As they’ve evolved from the simple syntaxes of the 1970s, they’ve become “trapped” by the ever-diminishing syntax available for new constructs.

Virtually every major improvement to Perl 5 regexes over the past decade has a syntax of the form “(?<something>)”. A modern regex that’s making use of the full power of Perl 5 regular expressions looks more like Lisp than Perl! It’s as if the long-term evolution of the regex syntax had produced 10 useful organs and 30 veriform appendixes.

It was time to redesign the entire organism, so that the simplest syntax could be assigned to the most useful constructs (instead of being monopolized by those constructs that happen to arrive first). We think of this as analogous to finding the optimal Huffman coding for regexes, so that commonly used regex features become easier to write and easier to read.

Если я правильно понял - то они хотят изменить способ задания регулярных выражений. Мне почему-то кажется это тупиковым путем. Ну будет еще один синтаксис perl регулярных выражений - вряд ли кому-то от этого станет легче. Лучше бы работали на гарантированной производительностью всех регулярных выражений, как это делают другие, пусть даже при этом пришлось бы отказаться от части функционала.

sign
()

>Изучаю perl

Сижу, изучаю сабж.

Шнурки

Сижу, учусь завязывать шнурки. Так, для собственного развития. А то мама сказала, что если не научусь сам завязывать шнурки, не возьмут в первый класс

Led ★★★☆☆
()

Кстати, вспомнил про библиотеку LWP, в принципе может все что может консольный браузер

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от DNA_Seq

Но она объектно-ориентированная а ООП в перле чересчур хацкерское, так что лучше сначала осилить синтаксис

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от sign

> Если я правильно понял - то они хотят изменить способ задания регулярных выражений.

нет, вот именно этого никто делать не будет. а автор цитаты, увидев новые фичи в 5.10, предложил вообще заменить всё на «современные» лисповские регекспы, которые «умеют всё, что и перл, только больше и лучше!». не знаю, о чём он, но есть такая поговорка: «лучшее — враг хорошего». это я по цитате, по ссылке не читал, Ъ же ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

Если я правильно понял - то они хотят изменить способ задания регулярных выражений.

нет, вот именно этого никто делать не будет

Странно, читаем один и тот-же текст, а выводы делаем противоположные. ;)

sign
()
Ответ на: комментарий от arsi

Если я правильно понял - то они хотят изменить способ задания регулярных выражений.

нет, вот именно этого никто делать не будет

Ну а если из википедии ссылку приведу? Смогу убедить?

Wikipedia. Perl 6 rules. Changes from Perl 5

There are only six unchanged features from Perl 5's regexes:

Literals: word characters (letters, numbers and underscore) matched literally
Capturing: (...)
Alternatives: |
Backslash escape: \
Repetition quantifiers: *, +, and ?, but not {m,n}
Minimal matching suffix: *?, +?, ??

sign
()
Ответ на: комментарий от DNA_Seq

Спасибо, я искал, как записать эту строку

dumal ★★
() автор топика
Ответ на: комментарий от Led

Все когда-то начинали завязывать шнурки. А насчет первого класса - я не собираюсь профессионально писать на Perl. К тому же, как мне здесь уже подсказали на первой страничке, мне это и не надо (вредно)

dumal ★★
() автор топика
Ответ на: комментарий от sign

> Perl 6 rules. Changes from Perl 5

нет! перл6 ≠ перл! :)

там не только регекспы, там over 95% синтаксиса изменили. да на перл5 даже пхп похож больше, чем перл6… не понимаю, зачем его перлом назвали, это же совершенно другой язык, только людей путают…

я говорил об изменениях в регексп-движке «настоящего» перла (5.10.х и 5.12.х).

arsi ★★★★★
()
Ответ на: комментарий от sign

> stackoverflow.com

мне этот ресурс в первую очередь запомнился по фразе: «Stack Overflow works best with JavaScript enabled»… и ведь попробуй поспорить…

arsi ★★★★★
()

Немного доработал алгоритм. Теперь нет массивов (по многочисленным пожеланиям). Из файла выбирается первая цитата.

curl -s bash.org.ru/random | iconv -f cp1251 -t utf8 | perl -00 -ne 'local *inner = sub {$str=$_[0];$str=~s/<br>/\n/g;$str=~s/(<[^>]*>|\&\w*;|^\t+)//g;print $str};s{^\t{5}</div>\n(.*?)<\/div>$}{inner($1)}sme;'

Все равно грязно, но знаний пока не хватает на большее.

dumal ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.