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))];

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

★★

А я думал, что здесь будет
echo «test... test... test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

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

Ага :)
Я еще подумал, хорошо бы это cowsay передать :)

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

В толксах? А кому это будет интересно? А так, может, кто-нибудь что-нибудь хорошее из этого придумает

dumal ★★
() автор топика

Можно дурацкий вопрос? Так, для общего развития - ты на C когда-нибудь писал?

Xellos ★★★★★
()

Уже баг нашел: поскольку на экран выводится текст только до перевода строки, не все цитаты попадают целиком

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

Вам никогда не хотелось чего-нибудь новенького, что отличалось бы от того, что Вы пробовали раньше?

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

Модифицировал:

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

Буду думать над улучшением/собиранием все в одну строку. Через месяц-другой, надеюсь, все будет намного лучше

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

Для улучшения читабельности (для меня, конечно)

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

Вы имеете в виду, что нужна альтернативная логика, да? :)

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

Да? Не верю. C тут при том, что там, к счастью, нельзя написать @mas=(@mas,$_), там такие вещи надо делать руками, и это прививает понимание происходящего. Ассемблер тем более должен был бы привить понимание, и навсегда отбить желание так писать.

Xellos ★★★★★
()

Дальше. Цель всего этого безобразия какая? Вывести случайную цитату из файла? Зачем тогда обрабатывать КАЖДУЮ цитату?
Молодой человек, не программируйте больше. Пожалуйста. Я вас очень прошу. Вдруг судьба в очередной раз повернётся, и мне придётся работать с вашим кодом - а у меня нервы слабые.

Xellos ★★★★★
()

Как человек, много лет, по долгу работы, имеющий дело с перлом, могу дать совет очень ценнный: НЕ НАДО УЧИТЬ ПЕРЛ. Учи нормальные языки, с типизацией, с нормальными структурами данных, которые изначально разрабатывались как высокоуровневый язык, а не как костыль для сбора/анализа несложных текстовых данных.

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

Совершенно разные языки, совершенно разные подходы. Сравнивать нельзя В гугле нашел пример добавления в массив. Понравился своей наглядностью. Если Вы гуру в программировании, могли бы подсказать, как сделать лучше

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

Спасибо за совет. Perl лично меня привлек относительно малыми затратами на написание/понимание не особо замудренного кода (хотя парсить, например, второй комментарий, весьма затруднительно, даже если он и имел бы смысл)

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

Можно узнать физический смысл операции - получение случайной цитаты из списка случайных цитат? Чтобы было «совсем случайно»?

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

на странице bash.org.ru/random никогда не будет столько записей (я надеюсь, по крайней мере)

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

Нет, просто захотелось попробовать rand. Конечно, можно было бы ограничиться и первой записью

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

Я не гуру. Я просто головой обычно думаю. И моя голова приходит в ужас от этой операции. Нет, если компилятор очень умный, он наверное это как-то оптимизирует... Но лично я вижу здесь два memory allocation, два memory deallocation, и два копирования. И всё это ради того, чтобы в конец списка добавить один элемент. И если в списке, я повторюсь, двести тысяч записей...

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

Вы меня убедили. К тому же я писал еще в самом первом посте:

Сам знаю, что получилось фигово

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

Спасибо за Ваше ценное мнение

dumal ★★
() автор топика

Похвальное начинание. Но, если хотите изучать перл, _пожалуйста_, возьмите лист бумаги и напишите ручкой 20 раз... ну 10 хотя бы...

use warnings;
use strict;

И начинайте с этого все Ваши программы на перле. Их потом гораздо проще будет читать и модифицировать!

lodin ★★★★
()

Ты применяешь регулярные выражения для разбора html?

Тогда надо прочитать вот это:

Ответ bobince на вопрос RegEx match open tags except XHTML self-contained tags

Краткая цитата для Ъ

You can't parse [X]HTML with regex.

Because HTML can't be parsed by regex.

Regex is not a tool that can be used to correctly parse HTML.

As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML.

Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML.

HTML is not a regular language and hence cannot be parsed by regular expressions.

Regex queries are not equipped to break down HTML into its meaningful parts.

so many times but it is not getting to me.

Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML.

You will never make me crack.

HTML is a language of sufficient complexity that it cannot be parsed by regular expressions.

Even Jon Skeet cannot parse HTML using regular expressions.

...

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

Вообще самый нормальный путь изучения Перла - книжка с ламой (Изучаем Perl, Ренди Шварц) - неделя-две максимум, затем книжка с верблюдом за авторством самого Уолла (за месяц можно управится не торопясь) и в качестве общего развития - сборник рецептов (не помню что за животина нарисована) и книжка с совой по регулярным выражениям, есть еще карманный справочник по ошибкам тоже издательства о'Рейли

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

Сишники такие сишники...

>Но лично я вижу здесь два memory allocation, два memory deallocation, и два копирования.

Это все ерунда, компилятор у перла действительно очень умный а регэкспы вещь тормозная by design

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

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

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

Регулярными выражениями можно сделать что угодно

Например валидацию выражения aⁿbⁿcⁿ ?

Перл это не больница с сотней врачей, скорее это палатка полевой хиругии

Возможно. Про перл я ничего не знаю и не узнаю. Это один из языков в незнании которых я специализируюсь.

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

Читаю сейчас про регулярные выражения. Решил закрепить знания. Придумал себе вот такую вот задачу. Она работает. Пока. Я рад. Но за цитату - отдельное спасибо. Пока не влезаю в такие сложности

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

Читаю как раз сборник рецептов. Не рискну назвать животное, которое изображено на обложке :)

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

>$_=~ указывать необязательно, регэкспы с ним по дефолту и работают

Спасибо, я знаю. Первый вариант очень грязный, но он работает

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

Через пару дней, надеюсь, перепишу начисто

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

DNA_Seq

Регулярными выражениями можно сделать что угодно, это самостоятельный тьюринг-полный язык.

Хер-на-ны! В том смысле, коллега, что регулярные выражения --- это лишь способ описания конечных автоматов. Уже строки, порождаемые контекстно-свободными грамматиками для него неразрешимы, я уж молчу про полноту по Тьюрингу.

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