Perl:使用foreach循环从哈希打印前25个值

时间:2014-05-06 09:32:30

标签: perl loops hash foreach

首先感谢你花时间看这个。

我是perl的新手,我在学习的每一种该死的语言中苦苦挣扎......我猜我小时候被摔了太多次。我正在运行一个脚本,用于通过ssh登录失败登录的安全日志。

我想只打印此代码中的前25个结果,但我尝试的所有内容似乎都没有(对于另一个foreach):/,希望得到一些想法,然后自己表面。现在已经晚了......是的,那就是......这就是我愚蠢的原因

# 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

提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

一些评论:

  • for 相同foreach。这两者是同义词。
  • 你应该use strict; use warnings;。这将要求您使用formy循环内声明和使用的变量的范围词法化。