LINUX.ORG.RU

perl обработка журнала squid


0

0

1) Можно ли в перл сделать хеш с двумя ключами?
Например: $download{$ip_client,$site) = $byte.
После обработки записи журнала squid, делать статистику:
"клиент - сайт - скачал".
Сейчас уже работает "клиент - скачал".

2) Правильно так выделить сайт из url?
$url = "http://r.mail.ru/cgi-bin/banners/js/1946?";;
@url_new = split("/",$url);
print "$url_new[2] \n";

Только учусь...


#! /usr/bin/perl -w

$key1='10.1.2.3';
$key2='www.mail.ru';
$key3='10.1.4.8';
$key4='google.com';
$hash1{"$key1|$key2"} = 'test line1';
$hash1{"$key1|$key4"} = 'test line2';
$hash1{"$key3|$key2"} = 'test line3';
$hash1{"$key3|$key4"} = 'test line4';

foreach (keys(%hash1)) {
        print "$_ \t---- $hash1{$_}\n";
}


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

Понял: в качестве ключа использовать строку из двух ключей.
Такое тоже проходит:
$hash1{$key1,$key2} = 'test line1';
Только на выходе получается:
$key1.$key2 ---- test line1

Правильно выделять сайт из url с помощью split?

WinLin
() автор топика

$download{$ip_client}{$site} = $byte;

Посмотри Regexp::Common

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

Сделал цикл из 50000 извлечений host из url.
Запускал по несколько раз.
Привожу результаты замеров.

1) выполняется 17 секунд:
use URI;
my $host = URI->new("http://www.linux.org.ru/rules.jsp";)->host;

2) выполняется 3 секунды:
@url_temp = split("/","http://www.linux.org.ru/rules.jsp";);
my $host = $url_temp[2];

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

Конечно, каждый выбирает, то что ему нужно, съэконимить 0.004 секунды на выполнении или час-два на осуществлении и отладке. :). Кстати, а как split справляется с такими url как http://www.linux.org.ru:80/ или mailto:, ftp:? Или с обработкой ошибочных url? :-) Это риторический вопрос, если что.

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

split из http://www.linux.org.ru:80/
создает www.linux.org.ru:80 - в итогах будет две записи на один
сайт. Для меня это не важно :)

use URI;
URI->new($url)->host делает это более корректно
www.linux.org.ru

При разборке огромного файла преимущества скорости важнее.
Возникло сомнение правильно ли я использовал URI.
split использует один и тот же массив, который затирается
на каждой итерации цикла. А объект URI никто не стирает
и наверно этих объектов накапливается 50000.





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

> А объект URI никто не стирает и наверно этих объектов накапливается 50000

Ты не прав. После строчки URI->new($url)->host объект URI освобождается. Ты же не создал на него долгоживущий referense, garbage collector его сразу и удалит.

А чем тебе regular expression m!^https?://([^:/]+)! не устроил? perl regexp очень быстры. По идее, должно быть чуточку быстрее и экономнее split, хотя ошибка измерений будет больше, чем результат. :)

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

Сам виноват, в $url записал "ftp://...".
Но все равно неправильно...

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

Спасибо за помощь и разъяснения.

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