Использовать Файл :: Найти
Я пытался составить полный пример для вас. Но вы говорите, что не очень хороши в регулярных выражениях, поэтому, хотя я включил все совпадения, которые, как вы сказали, вам нужны, вы можете устранить их один за другим, пока не поймете, что происходит.
Вы можете сохранить этот скрипт в файле, скажем script.pl, и назвать его так:
perl script.pl dir1 dir2 и dir1 и dir2 будут подвергнуты глубокому поиску.
Sub wanted
будет вызываться во всех файлах и каталогах, но я добавил проверку, чтобы немедленно вернуться, если текущая запись ($ _) является каталогом.
ПРИМЕЧАНИЕ. Поскольку я добавил / x к регулярному выражению, вы можете добавить пробел, чтобы разбить регулярное выражение на несколько строк, чтобы его было легче читать. Вы можете добавить /i
, если вам нужен поиск без учета регистра.
use strict;
use warnings;
use File::Find;
my $filename_to_check = 'filename'; ## or you could set it as first arg and say
## my $filename_to_check = shift @#ARGV;
my $filename_check = qr/(?:
include\s*\(\s*"$filename_to_check\.c"\s*\)|
require\s*\(\s*"$filename_to_check\.c"\s*\)|
new\s+$filename_to_check\s*\(|
class\s+\S+\s+extends\s+$filename_to_check|
class\s+\S+\s+implements\s+$filename_to_check|
$filename_to_check\::[\w]+\s*\(\s*\)
)/x;
&find(\&wanted,@ARGV); ## where ARGV has all the directories you want to search
sub wanted
{
## don't try to open directories like files
## you can also return (exit wanted for current file) based on file extension.
## or other arbitrary reasons.
return if -d $_;
eval
{
open F,$_ || die "Can't read $File::Find::name, $!\n";
my $found = 0;
while(<F>)
{
if($_ =~ $filename_check)
{
$found ++;
print $_;
}
}
if($found)
{
print "Found $found matches in file, $File::Find::name\n";
}
};
if($@)
{
print STDERR $@;
}
}