#!perl use strict; my %data = ( 'sort 1' => {'a.b.c' => ['19:20', '20:30'], 'a.b.d' => ['15:10', '19:40']}, 'sort 2' => {'e.f.g' => ['12:13'], 'g.h.i' => ['8:15', '23:11']}); my %times; foreach my $sorter (values %data) { foreach my $domain (keys %$sorter) { foreach my $time (@{$sorter->{$domain}}) { push(@{$times{$time}}, $domain); } } } foreach my $time (sort { cmpTime($a, $b) } keys %times) { foreach my $domain (@{$times{$time}}) { print "domain: $domain, time: $time\n"; } } sub cmpTime { my ($t1, $t2) = @_; my ($h1, $m1) = split(/:/, $t1); my ($h2, $m2) = split(/:/, $t2); return 60*$h1 + $m1 <=> 60*$h2 + $m2; }