#!/usr/bin/perl use strict; use warnings; # The source host is the key for the hash %total_bytes. # The value is a reference to an anonymous hash. # # In this anonymous hash the key is the destination host. # The value is the amount of bytes totally sent to that destination by $source. my %total_bytes; while (<>) { if (/#.*/) { next; } else { my ($source, $destination, $bytes) = split; $total_bytes{$source}{$destination} += $bytes; } } # This prints the $value for gilligan.crew.hut, some amount of $bytes #print "$total_bytes{'professor.hut'}->{'gilligan.crew.hut'}\n"; # This prints the HASH address #print "$total_bytes{'professor.hut'}\n"; #print "$total_bytes{'gilligan.crew.hut'}\n"; for my $source (keys %total_bytes) { for my $destination (sort keys %{$total_bytes{$source} }) { $total_bytes{$source}{'total'} += $total_bytes{$source}{$destination}; } } sub by_traffic { $total_bytes{$b}{'total'} <=> $total_bytes{$a}{'total'} } sub by_host { my $source = shift; $total_bytes{$source}{$b} <=> $total_bytes{$source}{$a} } for my $source (sort by_traffic keys %total_bytes) { print "$source: \n"; for my $destination (sort {by_host($source)} keys %{$total_bytes{$source} }) { print "\t$destination: $total_bytes{$source}{$destination}\n"; } }