I do this like so. ;)
#!/usr/bin/perl
use Modern::Perl;
use autodie;
my ($dir, $match) = @ARGV;
die "directory does not exists $dir" unless -d $dir;
die "No match" unless $match;
open_readdir($dir, \&process);
sub process {
my ($dir, $file) = @_;
if (-T "$dir/$file") {
open my $fh, '<', "$dir/$file";
say "$dir/$file: $_"
for grep /$match/, $fh->getlines;
$fh->close;
}
}
sub open_readdir {
(my $dir = shift) =~ s/\/$//;
my $code = shift;
my $db;
opendir $dh, $dir;
my @files = grep !/^\./, readdir $dh;
for my $file (@files) {
if (-d "$dir/$file") {
open_readdir("$dir/$file", \&process);
} else {
&$code($dir, $file);
}
}
closedir($dh);
}