#!/usr/bin/perl use strict; use warnings; open my $FH, '<', 'input' or die $!; sub slow { my ($fh) = @_; seek $fh, 0, 0; my @list = <$fh>; my $linecounter; my %ipURL; foreach (@list) { $linecounter++; my @message=split(',',$_); my $ip=$message[7]; my $url=$message[31]; if (!(exists $ipURL{$ip})) { my @urlList; push(@urlList,$url); $ipURL{$ip}= \@urlList; } else { my @urlList=@{$ipURL{$ip}}; push (@urlList,$url); $ipURL{$ip}=\@urlList; } if (!($linecounter % 50000)) { print "Lines: $linecounter\n"; } } return \%ipURL } sub fast { my ($fh) = @_; my %ipURL; seek $fh, 0, 0; while (<$fh>) { my ($ip, $url) = (split /,/)[7, 31]; push @{ $ipURL{$ip} }, $url; } return \%ipURL } use Test::More tests => 1; is_deeply slow($FH), fast($FH), 'same'; use Benchmark qw{ cmpthese }; cmpthese(-3, { slow => sub { slow($FH) }, fast => sub { fast($FH) }, });