Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Ирина_М Гость
|
Добавлено: Чт Окт 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 |
|
Вернуться к началу |
|
|
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 в конце - модификатор, поставленный тут явно не по делу - задаёт режим "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 Заголовок сообщения: |
|
|
Да, странный результат. А можно сюда получившийся скрипт выложить, который это делает? |
|
Вернуться к началу |
|
|
|