Открыть список
Как стать автором
Обновить

Комментарии 47

Цикл с "File.open("text.txt").each do |line| " предпочтительнее, чем readlines, поскольку засасывать в память файл неизвестного размера не есть рекомендуемая практика.
Ну ведь все равно потом файл надо в память вставлять
Нет. Можно считать количество слов в строке для каждой строки отдельно и накапливать сумму в переменной. Подсчёт символов, символов кроме пробелов, слов — точно так же. Для подсчёта абзацев нужно посчитать количество пустых строк (содержащих только \n). Подсчитать количество предложений немного сложнее. Нужно объявить переменную, в которой будет храниться количество слов предложения, конец которого ещё не найден. Дальше, я думаю, понятно.
Понимаю :) Ну у нас тут все незатейливо так — пока лишь демонстрация возможностей. В то же время а если я гигантский файл в одну строку выстрою? Все равно она вся в память пойдет? Или я ошибаюсь?
не ошибаетесь;) так что лучше читать например по 32 кило;) или по какому-либо другому заданному размеру… только необходимо учитывать что мы можем остановиться на середине слова
А лучше вообще файл на память отобразить и пускай ОС решает, как ей удобнее читать, а м ы на это дело ни байта не потратим ;)

А по существу — неужели нет в Ruby метода, возвращающего не результат замены вхождений паттерна на строку, а количество этих вхождений?

P.S. Еще паттерн для предложений, по-моему не самым лучшим способом написан, будет большое число «фальстартов»!!! Или не будет?! :)
Не в качестве рекламы добавлю, что в ленивых языках так сделать можно, файл полностью читаться не будет.
Вообще хотелось бы заметить автору этой серии топиков, что приводить переводы без указания авторства, с намёком на то, что это собственный труд, несколько некрасиво, если не сказать сильнее, и противоречит правилам портала. Текст должен быть оформлен как «перевод».

Практически весь текст (а не только примеры) взят из книги: Peter Cooper, «Beginning Ruby: From Novice to Professional», 2007, ISBN-10: 1-59059-7664. Мне неизвестно, существует ли русское издание этой книги, поэтому я предполагаю перевод, а не копипейст.

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

Безотносительно вышеизложенных соображений этики и приличия, публикация глав из книги по основам языка в виде серии статей представляется идеей более чем сомнительной: комменты превращаются в соревнования ищущих ошибки в тексти и замечания, как сделать лучше.
Да никаких намеков на собственный труд — как я уже писал с самого начала — я совершенный непрофессионал в Руби и точно так же самостоятельно учусь, учусь по этим самым книгам и просто хочу заинтересовать других в языке. Да, представьте себе, здесь в комментариях меня поправляют, находят ошибки и делают замечания, но это и есть цель, поставленная в этих статьях — этим замечателен хабр — всегда найдутся профи и помогут.

Неправильно было бы и оформлять как перевод, так как я делал и свои включения в текст… При написании этих шести статей уже использовались порядка десяти книг — в этом и прелесть для читателей, что нет необходимости штудировать учебники (каждый из которых имеет и слабые, и сильные строны) — достаточно, не отрываясь от работы, не уходя с любиго портала, прочитать одну-две статьи в сутки — и у вас уже есть представление о языке.

Вы посмотрите на блог Ruby — за пять дней, которые идет этот цикл статей, были написаны 13 топиков (7, если не считать мои). Сколько было написано за предшествующие пять дней? Одна статья… Разве это не здорово, что вернулся ко вниманию такой актуальный язык? Тем более вам, как спецу (вы тоже в руби писали, как вижу)…
О, кстати, обзор книг по руби небольшой был бы очень кстати.
Отправляется в todo ;)
будет на днях, может сегодня вечерком, я его уже начал писать, но не закончил
ой спасибо… жду с нетерпением
Дело ещё в том, что хочется более профессиональных материалов, а в некоторых Ващих статьях, Вы опускаетесь до самых азов программирования, которые, мне кажется, здесь не уместны. bubuq совершенно справедливо замечает, что местами Вы не понимаете сути происходящего.
Автор с самого начала написал, что программировать он не умеет и изучает это искусство на базе руби. О ходе этого изучения он и пишет тут для таких же как и он, рассчитывая, что если он ошибется где-то, или что-то неправильно поймет, то его поправят «более опытные товарищи»
На безрыбье… кому надо тот докопается до истины :) а хабрадядька MaxElc дает лишь толчок.
всё что Вы говорите — правда, но согласен с bubuq — Вы должны были указать источник всего этого добра.
Так, между прочим, понятие «американского» параграфа — это не два перевода строки, а вертикальный отступ между параграфами, вовсе необязательно равный по высоте одной строке. Два перевода строки для обозначения конца параграфа — это всего лишь формат исходных данных. Может вообще не быть в текстовом файле строк как структурных единиц, а перевод строки будет обозначать конец абзаца, это какое понятие параграфа — китайское? Кстати, а как в «русском параграфе» определить его начало? Таб? Несколько табов? Пробел? Несколько пробелов? А может еще что?

В HTML, например, параграф обозначается тегом <p> а уж как его выводить на экран, с вертикальным отступом, или горизонтальным, или и тем, и другим (модная традиция в руской веб-типографике) решает браузер. txt файл от html в этом отношении ничем не отличается, это данные, которые программы обрабатывают (и, возможно, но необязательно, выводят пользователю) согласно некоторому предполагаемому формату данных. Одна программа воспримет два подряд переноса строки как конец параграфа, а другая как просто пустую строку, а третья вообще все повторяющиеся пробельные символы будет игнорировать и оставит только по одному пробелу.
Всё это справедливо, и лишь демонстрирует моё утверждение о том, что комментаторы как правило, разбираются в вопросе лучше автора, что превращает статью из информативного материала в материал для битья.
Если бы я разбирался в руби, то скорее сам начал бы писать что-то вроде «практическое пособие по переходу с php на ruby» :) А так пока занимаюсь своими задачами, делаю потихоньку перевод документация к одному php-фреймворку и читаю «капли», гоняя примеры и пытаясь вносить в них небольшие изменения. Глядишь к концу цикла понадобится только беглое прочтение документации и можно приступать к работе

Формат подачи материала меня полностью устраивает, включая возможность задавать «нубские» вопросы и получать ответы на них от тех, кто действительно разбирается. Можно было бы конечно взять какую-нибудь книгу, или просто доки скачать и начать портировать какой-нибудь простой, но реальный проект, но изучать сразу два предмета в таком режиме я уже отвык, да и времени нет
НЛО прилетело и опубликовало эту надпись здесь
Нда, теперь понятно почему статьи с такой высокой, для новичка, периодичностью выходят.
сделайте, пожалуйста, ссылки на другие «капли», как раньше делали
Наверное стоит сделать отдельный пост (лучше в личном блоге) и собирать там «оглавление». А то постов так через дцать… полстатьи линки будут занимать :)
в этой статье есть Эпилог, что значит что она заключительная наверное :)
Эпилог есть в каждой статье этого цикла, нравится, видимо, автору это слово :)
НЛО прилетело и опубликовало эту надпись здесь
Предложения вы считали таким регекспом:
/\.|\?|!/

А если предложения заканчиваются на троеточия или "?!"?
Тогда уж наверное лучше так:
/[\.\?!]{1,3}/
Многоточие — это один знак препинания, а не три точки…
НЛО прилетело и опубликовало эту надпись здесь
Я, например, ставлю всегда одним символом многоточие.
А на руби обрабатывать такие тексты пробовали?
Вы имеете ввиду тексты в UTF?
Вы, кажется, сейчас сами придумали проблему, и уже намереваетесь расказать, как она решается.
При чем тут вообще эти многобайтовые кодировки? Не об этом речь была в моем верхнем комменте.
Я бы не стал делать догадок. Чем отличаются строки с многоточием от строк с тремя точками? Я не понимаю.
точки входят в ASCII, многточия нет :)
В Вас я не сомневаюсь:))
Мне интересно если, Nakilon всерьёз не рассматривает эту идею, отвергая мой вопрос о кодировках, то какое у него объяснения на этот счёт…
А предложил человеку усовершенсвовать регексп немного, не залазя в дбри кодировок, а вы зачем-то пристали ко мне со своими типографскими штучками.
Я проргаммист, автор статьи — программист. А троеточия — это куда-нить в другой блог.
Ну регэксп этот можно усовершенстовать очень долго (а потом прийти к выводу об отказе от него и разработке грамматического анализатора :) ). Например очевидный для меня недостаток — если внутри предложения будут использованы точка, вопросительный или восклицательный знак, то такое предложение посчитается за два.

В данном учебном (причем не по регэкспам) примере думаю не имеет смысла расписывать все варианты, интересны, имхо, способы использования регэкспов в руби, а не разработка самих регекспов
В своем примере я не стал перечислять множество разных знаков (хотя это тоже было бы совершенсовованием регекспа), а добавил лишь одну фишку, т.к. она простая (короткая), но уже вносит свой плюс.
А что это за предложение такое, что внутри его вопросительный знак? ..)
Насчет вашего имхо, — согласен. Просто тема регекспов раскрыта мало, а для многих, кто сейчас эти капли читает, руби — чуть ли не первое углубление в программироваине, поэтому у многих нет опыта в регекспах, — так пусть наконец освоят ..)
Мы тут в комментах захлебнемся, если каждый будет предлагать свою фишку, а итоговое выражение станет для новичков абсолютно нечитаемое :( Я бы, например, предложил считать предложением последовательность символов максимальной длины от «большой» буквы до [.?!]+ внутри которой нет такой же последовательности. Вы бы вспомнили про то, что предложение может начинаться с цифры (я не прав? :) ) и т. д., и т. п.

А вот предыдущее предложение было примером, когда внутри встречаются и вопросительные знаки и точки :)

А регэкспы при обучении языкам (кроме перла :))) ) вообще больная тема, я даже принципа их работы не понял по описаниям в различных мануалах и гайдах, где их вскользь затрагивали, пока не прочитал толстенную книгу. Хотя то, что не понял, не мешало мне их копипастить, например из библиотеки регэкспов и даже немного модифицировать при разработке на трех языках :)
НЛО прилетело и опубликовало эту надпись здесь
Большое спасибо за наводку. Давно искал что-то подобное :)
Угу, или так: [\.\?!]\s+
Только зачем экранировать точку и вопросительный знак внутри []?
НЛО прилетело и опубликовало эту надпись здесь
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.