foreach my $hostname (sort {$hash{$a}->ip_address() cmp $hash{$b}->ip_address() or $a cmp $b} keys %hash) {...} sub ip_sort { my @a = split /\./, $a; my @b = split /\./, $b; return $a[0] <=> $b[0] || $a[1] <=> $b[1] || $a[2] <=> $b[2] || $a[3] <=> $b[3]; }