Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

PERL - как находить похожие строки?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Ирина_М
Гость





СообщениеДобавлено: Чт Окт 28 2004 14:30    Заголовок сообщения: PERL - как находить похожие строки? Ответить с цитатой

Здравствуйте. Задача такая. Есть куча строчек, где записаны названия вирусов. например:

Win32.HLLM.Netsky.35328
Win32.HLLM.Netsky.17920
Win32.HLLM.Netsky.28008
Win32.HLLM.MyDoom.54464
Win32.HLLM.Netsky.based
Win32.HLLM.Beagle.20480
Win32.HLLM.Beagle.37964
Win32.HLLM.Beagle

Мне нужно посчитать, сколько там нетски (без уточнения версии), сколько биглов и т.д. Считать, например, до 3-ей точки нельзя, т.к. еще бывают строки типа Trojan.IframeExec
Номера вроде просто тоже нельзя отсекать... Может кто-то поделится умными мыслями?
А то я этот перл 3ю неделю всего юзаю и мало что знаю))
Вернуться к началу
droopy



Зарегистрирован: 28.07.2004
Сообщения: 168

СообщениеДобавлено: Чт Окт 28 2004 15:55    Заголовок сообщения: Ответить с цитатой

используй $x = index( $string, $substring );
если строка не найдена возвращает -1
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Чт Окт 28 2004 17:47    Заголовок сообщения: Re: PERL - как находить похожие строки? Ответить с цитатой

Ирина_М писал(а):
Считать, например, до 3-ей точки нельзя, т.к. еще бывают строки типа Trojan.IframeExec
Номера вроде просто тоже нельзя отсекать...

Ну для начала надо сформулировать критерий деления строки на искомую часть и игнорируемую, дальше просто. Допустим, надо игнорировать то, что после последней точки, тогда:
Код:

$str=~s/\.[^.]*$//i; # Отрезать последнюю точку и все не-точки за ней до конца строки
$counter{$str}++; # Увеличить счётчик для оставшегося "ключа"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Ирина_М
Гость





СообщениеДобавлено: Пн Ноя 01 2004 16:58    Заголовок сообщения: Ответить с цитатой

СПАСИБО!!!!!!
А не объяснители Вы, что всё это означает.. знаю, что $ - конец строки... а остальное?
Вернуться к началу
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Вт Ноя 02 2004 13:51    Заголовок сообщения: Re: PERL - как находить похожие строки? Ответить с цитатой

Код:
$str=~s/\.[^.]*$//i; # Отрезать последнюю точку и все не-точки за ней до конца строки

$str - переменная со строкой текста;
=~ - оператор привязки, говорит, что к переменной $str надо применить стоящий справа оператор замены регулярного выражения s;
s/S/T/i - тот самый оператор замены, где S - заменяемая часть строки (если нашлась), T - заменяющая строка (в данном случае пустая);
\.[^.]*$ - само регулярное выражение, в котором:
\. - символ точки (без \ означает любой символ, с \ означает сама себя)
[^.]символьный класс: любой символ кроме точки (^ - инверсия)
[^.]* - любой символ кроме точки, повторяющийся любое количество раз...
$ - ...до конца строки
i в конце - модификатор, поставленный тут явно не по делу Cool - задаёт режим "Ignore case" для поиска заданной подстроки.

Код:
$counter{$str}++; # Увеличить счётчик для оставшегося "ключа"

В $str остаётся ключевая часть, которая берётся в качестве ключа хэша %counter, элемент хэша с именем, лежащим в $str, увеличивается на единицу (изначально он неопределён и считается нулём) - стандартный способ подсчёта повторяющихся элементов на Перле.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Ирина_М
Гость





СообщениеДобавлено: Вт Ноя 02 2004 15:08    Заголовок сообщения: Ответить с цитатой

Ух))) спасибо, что так подробно)))

Только теперь другая проблема... сейчас подробно напишу, ... есть файл, такой:

490 Win32.HLLM.Netsky.35328
159 Win32.HLLM.Netsky.based
120 Win32.HLLM.Beagle.37964
117 Win32.HLLM.MyDoom.54464
96 Win32.HLLM.Beagle
65 Win32.HLLM.Netsky.28008
58 Win32.HLLM.Netsky.22016
55 Win32.HLLM.Beagle.pswzip
37 Win32.HLLM.MyDoom.33808
27 Win32.HLLM.Beagle.18688
23 Win32.HLLM.Netsky.27648
20 VBS.Generic.348
18 Win32.HLLM.Beagle.20480
12 Win32.HLLM.Netsky.17920
11 Win32.HLLM.Beagle.57450
8 Win32.HLLM.Netsky.41984
5 Win32.HLLM.Netsky.37888
4 Win32.HLLM.MyDoom.2
3 Win32.HLLM.MyDoom.39936
3 Win32.HLLM.Lovgate.9
3 Win32.HLLM.Gibe.2
2 Trojan.MulDrop.899
2 Win32.HLLM.Yaha.4
2 Win32.HLLM.MyDoom.based
1 Win32.HLLM.Foo
1 Win32.HLLM.Klez.4
1 VBS.Redlof
1 Trojan.IframeExec
1 ABRA_KODABRA

(первая цифра - это кол-во вирусов.)
А результат скрипта получаем такой:

820 Win32.HLLM.Netsky
163 Win32.HLLM.MyDoom
327 Win32.HLLM.Beagle
21 VBS
10 Win32.HLLM
3 Trojan
1 ABRA_KODABRA

Т.е. всё, что встречается 1 раз, он обрезает до Win32.HLLM... а надо, чтобы оставлял эту часть...Например, Win32.HLLM.Lovegate... Но оставлять конкретно до надписи Win32.HLLM низя, т.к. скрипт долженбыть универсальным.
Вернуться к началу
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Ср Ноя 03 2004 12:18    Заголовок сообщения: Ответить с цитатой

Да, странный результат. А можно сюда получившийся скрипт выложить, который это делает?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...