Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подкиньте задачки по перлу, учу язык :) 
:(
    Опции темы
Irokez
Дата 12.9.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



Учу вот перл smile Голое чтение книги утомляет. Хочется попробовать реализовать какие то небольшие, но и не совсем элементарные задачи.
Перл понадобится в основном для обработки текстов (точнее для NLP), не для веб и не для системного программирования.
Буду признателен, если подкините задачки, на которых смогу учиться. Или может ссылки на задачи. Чьи то домашние задания тоже пойдут, но за срок выполнения я не ручаюсь smile
PM   Вверх
amg
Дата 13.9.2007, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Вот, например.
Написать программу-фильтр, преобразующую текст типа
Код

Yandex  www.yandex.ru
Google  www.google.com
Aport   www.aport.ru
Yandex  www.yandex.ru
Google  http://google.ru
Aport   http://aport.ru
Yandex  http://ya.ru
Google  http://www.google.ru
Yandex  yandex.ru
в
Код

Google www.google.com google.ru www.google.ru
Aport www.aport.ru aport.ru
Yandex www.yandex.ru ya.ru yandex.ru
В самый раз для перла. С использованием хэша массивов и регулярных выражений - всего несколько строк.
И в лингвистике подобное встречается. Например, сгруппировать по частям речи текст типа Мама(сущ.) мыла(гл.) раму(сущ.)

Это сообщение отредактировал(а) amg - 13.9.2007, 07:51
PM MAIL   Вверх
Irokez
Дата 13.9.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



ммм.. решил на 10-й строке сделать проверку на уже имеющийся урл.. однако, почему то не работает =(
Код

push(@{$urls{$site}}, $url) unless grep(/^$site$/i, @{$urls{$site}});

PM   Вверх
Sadok
Дата 13.9.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Каждый перловик должен написать свою поисковую систему smile
PM   Вверх
Irokez
Дата 13.9.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



а .. разобрался.. и вдобавок сократл код =)
Код

#!/usr/bin/perl -w

open(FILE, 'url-list.dat') or die 'Cannot open file!';
$urls = {};
while (<FILE>) {
    ($site, $url) = split(/\s+/);
    if (!exists($urls{$site})) {
        $urls{$site} = [$url];
    } else {
        push(@{$urls{$site}}, $url) unless grep(/^$url$/i, @{$urls{$site}});
    }
}

print "$_ " . join(' ', @{$urls{$_}}) . "\n" foreach (sort keys %urls);


Добавлено через 1 минуту и 52 секунды
вопрос.. а нужно ли вообще условие if (!exists($urls{$site})) ? Без него вроде тоже работает и предупреждений не дает

PM   Вверх
Irokez
Дата 13.9.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


индеец
***


Профиль
Группа: Участник Клуба
Сообщений: 1180
Регистрация: 20.10.2004

Репутация: нет
Всего: 53



итого:
Код

#!/usr/bin/perl -w

use strict;

open(FILE, 'url-list.dat') or die 'Cannot open file!';
my %urls;
while (<FILE>) {
    my($site, $url) = split(/\s+/);
    push(@{$urls{$site}}, $url) unless grep(/^$url$/i, @{$urls{$site}});
}

print "$_ " . join(' ', @{$urls{$_}}) . "\n" foreach (sort keys %urls);

PM   Вверх
Shaggie
Дата 13.9.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(amg @  13.9.2007,  07:56 Найти цитируемый пост)
Yandex  www.yandex.ru
Google  www.google.com
Aport   www.aport.ru
Yandex  www.yandex.ru
Google  http://google.ru
Aport   http://aport.ru
Yandex  http://ya.ru
Google  http://www.google.ru
Yandex  yandex.ru


Цитата(amg @  13.9.2007,  07:56 Найти цитируемый пост)
Google www.google.com google.ru www.google.ru
Aport www.aport.ru aport.ru
Yandex www.yandex.ru ya.ru yandex.ru

Irokez, обрати внимание - ведущие "http://", если они есть, должны быть обрезаны по условию задачи.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
amg
Дата 13.9.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Irokez, браво! Для новичка в перле - 5+.
Еще я просил не просто программу, а программу-фильтр (получает имя файла из параметра или текст из stdout), причем не случайно. На своем опыте знаю, что именно для обработки текстовых файлов фильтры предпочтительнее, т.к. сочетают гибкость использования с простотой написания. На каждую типовую задачу - свой коротенький фильтр, а потом их можно комбинировать через пайп.

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

Отсюда очередная задача: написать однострочник, который напечатает имена всех встречающихся в предыдущем тексте порталов (но без повторов).
PM MAIL   Вверх
korob2001
Дата 22.9.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Цитата(amg @  13.9.2007,  10:26 Найти цитируемый пост)
Отсюда очередная задача: написать однострочник, который напечатает имена всех встречающихся в предыдущем тексте порталов (но без повторов).

Как вариант:
Код

perl -e "$_{(split /\s+/)[0]}++ while <>;print join(\"\n\", keys %_)" file.txt

В конце можно указать несколько файлов со списком порталов и все они будут обработаны как один. Например:
Код

perl -e "$_{(split /\s+/)[0]}++ while <>;print join(\"\n\", keys %_)" file1.txt file2.txt file3.txt



Это сообщение отредактировал(а) korob2001 - 22.9.2007, 12:39


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Nab
Дата 22.9.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 25.3.2006
Где: Kiev

Репутация: 26
Всего: 37



Ну вот smile 
Модер с моря приехал небось, и с ходу в бой smile

Задачка то была не для монстров от перла, типа тебя smile




--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
under_sun
Дата 15.10.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: нет
Всего: 17



Если тебе еще нужны задачки, то могу подкинуть одну достаточно интересную задачку на сравнение выражений.

Задача заключается в следующем: 
Даны два выражения - например   a+2bc-(b+c)^2+2*a   и   3a-(b*b+c^2). Нужно сказать равны они или нет.
Знак умножения может опускаться (т.е. 2bc, 2*bc, 2*b*c считается корректной записью).
Также может быть любая вложенность скобок. 
Вот еще пара примерчиков:
               (x+z)(x+z)(x+z)   и   (x+z)^3
               (a+b)(3+4+5-2*(a-2b)*3+2a-12b)   и   -4*(a+b)(a-3)

Удачи  smile    
--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
korob2001
Дата 15.10.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



А чему равны переменные x, z, a, b, c?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
under_sun
Дата 16.10.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: нет
Всего: 17



Ни чему не равны, это произвольные переменные. 
В этом то и фишка  smile 
--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
arto
Дата 16.10.2007, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



а вы сами знаете решение?
PM MAIL ICQ   Вверх
KSURi
Дата 16.10.2007, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Если слегка упростить задачу: знак степени заменить на ** и убрать условие об опускании знака умножения, то задача решается в одну строку)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1763 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.