2014-05-06 57 views
1

首先感谢您抽出宝贵时间看一下。Perl:使用foreach循环从哈希中打印前25个值

我是新来的perl,而且我在学习的每一门该死的语言中都与计数相抗争......猜猜我小时候掉了太多次。我正在运行脚本grep安全日志通过ssh登录失败。

我想只打印此代码的前25个结果,但我所尝试的所有内容似乎都没有做到这一点(而另一个foreach):/希望得到一些想法,然后facepalm自己。这也是后期......是啊,就是这样......这就是为什么我很愚蠢

# list each IP ($z) and number of attempts ($count{$z}, sort by highest amount of attempts 

foreach $z (sort { $count{$b} <=> $count{$a} } (keys %count)) { 
     @geoData= &getGeo($z);   # use subroutine getGeo to get location info 
     $cityName = $geoData[0];   # extract city from location info 
     $countryCode = $geoData[1];   # extract country code from location info 
     $reg = $geoData[2]; # extract country code digit 
     printf " %4d %-20s %-3s %-6s %-20s\n", $count{ $z }, $z, $countryCode, $reg, $cityName; 
} 

下面是输出的将是什么样子,它只是列举了数百IP的,我只是想25

=======================Intrusion Report======================= 
    Count Remote IP Address Country City 
============================================================== 
    7427 182.x.x.x   IN 
    4091 200.x.x.x   DO 05  Santo Domingo 
    2808 42.x.x.x    CN 
    2223 114.x.x.x   CN 23  Shanghai 
    1958 122.x.x.x   CN 02  Hangzhou 
    1915 202.x.x.x   ID 04  Jakarta 
    1410 klinikk.x.x.x  RU 47  Klin 
    1190 195.x.x.x   DE 16  Berlin 
    805 60.x.x.x    CN 01  Hefei 
    646 tango054.x.x.x  DE 
    645 216.x.x.x   US CA  Canyon Country 
    645 72.x.x.x    US CA  Canyon Country 
    583 61.x.x.x    CN 02  Wenzhou 

预先感谢您!

回答

2

使用列表切片环路限制为25个元素:

for my $z ((sort { $count{$b} <=> $count{$a} } (keys %count))[0..24]) { 
    ... 
} 

几点意见:

  • for相同foreach。这两个是同义词。
  • 您应该use strict; use warnings;。这将要求您将for循环中声明和使用的变量的范围与my一起词汇化。
+0

哇,welp我没有看到我的书。我习惯于按照i ++或其他任何方式来做某件事,但仍然在学习。谢谢你,谢谢你,谢谢你!!!!!!!!!!!!!!!等等,我很快就说过了,它不按预期打印 – thewrp

+0

@thewrp:不客气。不要忘记接受答案(它也会提升你的代表) – Zaid

+0

它似乎从我的散列中随机打印25个具体值,仍然以降序排列,但除此之外我看不到一个模式:( – thewrp