有一個日誌文件,其中每行包含以空格分隔的字段。其中一個字段是源節點的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