ВОПРОС ДЛЯ ИНТЕРВЬЮ: Файл журнала Perl - PullRequest
0 голосов
/ 22 января 2011

Есть файл журнала, где каждая строка содержит поля, разделенные пробелами.Одним из полей является IP-адрес исходного узла.Мы хотим найти список IP-адресов, в которых больше всего записей в журнале.Допустим, найти 10 лучших IP-адресов с большинством записей журнала.

Это Perl Interview Question.Интервьюер хочет знать, как поступит кандидат.

PS: Этот вопрос был задан моему другу

Ответы [ 3 ]

7 голосов
/ 22 января 2011

Мой ответ, мистер или миссис Интервьюер, будет основан на ответах на несколько вопросов.Первый набор этих вопросов следует.Конечно, могут быть дополнительные вопросы, генерируемые ответами на эти вопросы.

  1. Вы говорите «одно из полей».Мы знаем какое поле?Это всегда одинаково или меняется?

  2. Будут ли в журналах только IPv4, только IPv6 или их смесь?Является ли сопоставление адресов между IPv4 и IPv6 проблемой при подсчете или могут ли сопоставления рассматриваться как уникальные исходные узлы?

  3. Насколько велик файл журнала?Сколько памяти доступно для решения проблемы?

  4. Доступны ли модули CPAN для использования, или решение ограничено только базовыми модулями или некоторыми другими "утвержденными" списками модулей?

6 голосов
/ 22 января 2011

Предположим, что IP-адреса указаны в столбце N:

use strict;
use warnings;
use constant N => 3;

my %counts;
while (<>)
{
    my(@fields) = split /\s+/;
    $counts{$fields[N]}++;
}

Это дает вам хэш адресов I / P и соответствующих значений.

my %iplist;
foreach my $address (keys %counts)
{
     my $count = $counts{$address};
     push @{$iplist{$count}}, $address;
}

Это дает вам хэш подсчетов и связанный с каждым отсчетом список IP-адресов с таким подсчетом.

use constant Wanted => 10;

my $printed = 0;
foreach my $count (sort { $b <=> $a } keys %iplist)
{
    print "$count: @{$iplist{$count}}\n";
    $printed += scalar(@{$iplist{$count}});
    last if $printed >= Wanted;
}

Это сортирует счет в обратном (нисходящем) порядке и распечатывает счет и список IP-адресов, которые появлялись так много раз. Он также подсчитывает количество напечатанных адресов и останавливает цикл, когда он соответствует требуемому числу или превышает его.

0 голосов
/ 22 января 2011

Спросите, предназначено ли это для одноразового использования.

  • Если нет, ответ Джонатана хороший.

  • Если да, используйтеоднострочник.

Предполагая, что первое поле содержит IP-адреса:

perl -ane '$count{$F[0]}++ } END { print $_, "\n" for (sort { $b <=> $a } keys %count)[0..9]'

Хороший вопрос, который проверяет знания кандидата о структурах данных, строка-массивманипулирование, сортировка и использование фрагментов массива.

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