#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @files; my $path = shift || '.'; print Dumper traverse($path); sub traverse { my ($path) = @_; return if not -d $path; opendir my $dh, $path or die; while (my $sub = readdir $dh) { next if $sub eq '.' or $sub eq '..'; push @files, "$path/$sub" if ("$path/$sub" =~ /(?:\btest\b|\banotherSample\b|\bsample\b)/); traverse("$path/$sub"); } close $dh; return \@files; } __DATA__ $ perl file.pl $VAR1 = [ './test.pl~', './sample.c', './test.txt~', './testDir/anotherSample.c', './test.pl', './test.txt' ];