2011-01-22 62 views
0

有一个日志文件,其中每行包含以空格分隔的字段。其中一个字段是源节点的IP地址。我们希望找到日志条目最多的IP地址列表。可以说找到大多数日志条目的前10个IP地址。面试问题:Perl日志文件

这是Perl面试问题。采访者想知道候选人将如何进行。

P.S:这个问题有人问我的朋友

+2

只是一个散列与IP地址作为关键? – 2011-01-22 00:13:15

+7

显然,候选人会问一个好友在堆栈溢出问... – daotoad 2011-01-22 00:33:31

回答

6

假设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地址列表。它还计算打印的地址数量,并在达到或超过所需数量时停止循环。

7

我的回答是,先生或女士采访者,将基于该回答几个问题。第一组问题如下。当然,这些答案可能会产生额外的问题。

  1. 你说“其中一个领域”。我们知道哪个领域?它总是一样还是有所不同?

  2. 日志是否只有IPv4,只有IPv6或两者的混合? IPv4和IPv6之间的地址映射是否值得关注,还是映射可以被视为唯一的源节点?

  3. 日志文件有多大?有多少内存可用来解决问题?

  4. 是否可以使用CPAN模块,还是解决方案仅限于核心模块或某些其他“已批准”模块列表?

0

询问这是否适用于一次性使用。

  • 如果不是,乔纳森的答案是好的。

  • 如果是,请使用单线。

假设第一个字段包含IP地址:

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

一个很好的问题,测试数据结构,字符串数组操作的考生的知识,整理和使用数组切片。