有一个日志文件,其中每行包含以空格分隔的字段。其中一个字段是源节点的IP地址。我们希望找到日志条目最多的IP地址列表。可以说找到大多数日志条目的前10个IP地址。面试问题:Perl日志文件
这是Perl面试问题。采访者想知道候选人将如何进行。
P.S:这个问题有人问我的朋友
有一个日志文件,其中每行包含以空格分隔的字段。其中一个字段是源节点的IP地址。我们希望找到日志条目最多的IP地址列表。可以说找到大多数日志条目的前10个IP地址。面试问题:Perl日志文件
这是Perl面试问题。采访者想知道候选人将如何进行。
P.S:这个问题有人问我的朋友
假设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地址列表。它还计算打印的地址数量,并在达到或超过所需数量时停止循环。
我的回答是,先生或女士采访者,将基于该回答几个问题。第一组问题如下。当然,这些答案可能会产生额外的问题。
你说“其中一个领域”。我们知道哪个领域?它总是一样还是有所不同?
日志是否只有IPv4,只有IPv6或两者的混合? IPv4和IPv6之间的地址映射是否值得关注,还是映射可以被视为唯一的源节点?
日志文件有多大?有多少内存可用来解决问题?
是否可以使用CPAN模块,还是解决方案仅限于核心模块或某些其他“已批准”模块列表?
询问这是否适用于一次性使用。
如果不是,乔纳森的答案是好的。
如果是,请使用单线。
假设第一个字段包含IP地址:
perl -ane '$count{$F[0]}++ } END { print $_, "\n" for (sort { $b <=> $a } keys %count)[0..9]'
一个很好的问题,测试数据结构,字符串数组操作的考生的知识,整理和使用数组切片。
只是一个散列与IP地址作为关键? – 2011-01-22 00:13:15
显然,候选人会问一个好友在堆栈溢出问... – daotoad 2011-01-22 00:33:31