my %sites;
my %regions;
while (<>) {
my ($region_id, $site_id, $layer_id) = split;
# Use hashes instead of arrays to remove duplicates.
++$sites{$site_id}{layers}{$layer_id};
++$regions{$region_id}{layers}{$layer_id};
++$regions{$region_id}{sites}{$site_id};
}
# "Flatten" hashes into sorted arrays of unique elements.
for my $site_id (keys(%sites)) {
my $site = $sites{$site_id};
$site->{layers} = [ sort keys(%{ $site->{layers} }) ];
}
for my $region_id (keys(%regions)) {
my $region = $regions{$region_id};
$region->{layers} = [ sort keys(%{ $region->{layers} }) ];
$region->{sites} = [ sort keys(%{ $region->{sites} }) ];
}
# Now do what we want to do.
for my $site_id (sort keys(%sites)) {
my $site = $sites{$site_id};
print "$site_id has layers @{ $site->{layers} }\n";
}
for my $region_id (sort keys(%regions)) {
my $region = $regions{$region_id};
print "$region_id has sites @{ $region->{sites} } and layers @{ $region->{layers} }\n";
}