my %count=(); # A hash -it is bcos of of key/value pairs? while (<$fh>){ if (/amavis.*(Passed|Blocked) (CLEAN|SPAM|INFECTED|BANNED)/){ ++$count{$2}; # Why ++$count? why {$2} here? is it bcos of (Passed|Blocked) ? } elsif (/amavis.*(BAD-HEADER)-/) { ++$count{$1}; # why {$1} here? is it bcos of (BAD-HEADER) } elsif (/reject/){ ++$count{'REJECTED'}; #Hmm, Why {'REJECTED'}? } } #### my @data = map{ $count{$_} || 0 } qw(CLEAN SPAM INFECTED BANNED BAD-HEADER REJECTED); Why map{ $count{$_} || 0 } ? qw(CLEAN SPAM INFECTED BANNED BAD-HEADER REJECTED) # here you create an array for count values? #### my $data = GD::Graph::Data->new([ ["Cleaned","Spam","Virus","Banned","BadHeader","Rejected"], [@data], ]) or die GD::Graph::Data->error; [@data] has count values coming from line qw(CLEAN SPAM INFECTED BANNED BAD-HEADER REJECTED)