in reply to Expanding directories

my @dirs = `ls /var/log/HOSTS/*/*/$year/$month/$day/*`

I'm not sure where you want to go with this, but I assume you want to do something in each directory that exists for the day/month/year for each logged host.

The canonical Perl way of doing this (without relying on an external program) is to use the venerable File::Find module.

use File::Find; find( sub { return unless $File::Find::name =~ m{^/var/log/HOSTS/([^/]+)/([^/]+)/(\d+)/(\d ++)/(\d+)/(.*)$}; my( $dir1, $dir2, $year, $month, $day, $file ) = ( $1, $2, $3, $4, $5, $6 ); # do stuff with $file }, '/var/log/HOSTS' );
Or if you do just want to get the names of the directories that actually exist, you would write something like:
$File::Find::name =~ m{^/var/log/HOSTS/([^/]+)/([^/]+)/(\d+)/(\d+)/(\d+)$} and push, @dirs, $File::Find::name;

print@_{sort keys %_},$/if%_=split//,'= & *a?b:e\f/h^h!j+n,o@o;r$s-t%t#u'