用于搜索案例(in)敏感文件名的java源代码的perl脚本

时间:2014-12-15 04:45:21

标签: perl

我正在尝试开发一个脚本,它将查看项目目录结构和源文件,主要是java和xml文件中的文件名,可能在代码中的错误情况下如何在目录/驱动器上命名文件位于。例如,驱动器上的代码Abc.xml中的ABC.xml。当我们从windows迁移到linux时,发现了这个问题。

我原本以为使用ACK但这里的防火墙似乎阻止了CPAN并且它仍然无法使用dmake在我的计算机上手动安装。 (使用草莓的最新版本)

这是我迄今为止能够组合在一起的内容,它以递归方式搜索基本路径下的每个子目录,获取java和xml文件。然后它会打开找到的每个文件并对源列表中的每个名称进行不区分大小写的搜索,然后它会对搜索结果进行区分大小写的匹配,以便在大小写相同的情况下删除结果,然后将否定结果存储在哈希中每个源文件(key)带有一个数组(值),用于存储发现大小写与文件名不匹配的每个文件的名称。最后我打算打印出哈希。

我目前在设置数组哈希时遇到了困难,但我对其他/更简单的解决方案持开放态度。

my $source = "C:/sampleSourcefiles";
my $base_path = "C:/baseDIRprojectCode";
my @searchList;
my %report;

#open source file directory.
if($source){
    opendir (DIR, $source) or die "Directory not found \n" ;
    @searchList = grep(/^.+\..+$/, readdir(DIR));
    closedir DIR;
}

#code does not have file extensions trim from names
foreach my $file (@searchList){
    $file =~ s/\.dat|xml$//;
    #print "$file\n";
}


process_files ($base_path);

# Accepts one argument: the full path to a directory.
sub process_files {
    my $path = shift;

    # Open the directory.
    opendir (DIR, $path) or die "Unable to open $path: $!";

    # Read in the files.
    my @files = grep {!/^\./} readdir (DIR);
    closedir (DIR);

    # append the full path to the file names.
    @files = map { $path . '/' . $_ } @files;

    for (@files) {

        # If the file is a directory
        if (-d $_) {
            process_files ($_);

        # If it isn't a directory, process the file.
        } else { 
            file_search($_);
        }
    }
}

# Accepts one argument: the source file to search
sub file_search {
    my $file = shift;

    #ignore all files not java or xml
    if ($file =~ /\.xml|java$/){

        #search for match to any file in the list
        foreach my $item (@searchList){
            open(F, $file);
            my @lines = <F>;
            close F;
            my @result = grep /$item/i , @lines;

            if (@result){
                %report($item, @result);

                #foreach my $res (@result){
                #   if($res eq $file){
                #       print "good result\n";
                #   } else {
                #       print "Inequality match found in file $file for $res\n"; 
                #   }
                #}
            } else {
              }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

你很顺利,但你可以改进。

首先:行

%report($item, @result);

没有任何意义;它不应该只是一个子程序调用吗?

report($item, @result);

其次,你想用什么哈希?

第三:你没有非常有效地迭代。为什么要重新打开并重新读取每个文件名的文件?

首先获取文件列表,将其小写形式映射到原始格式

更有效
my %lower2original = map { (lc($_), $_) } @files;

然后使用qr运算符构建一个大的正则表达式,以不区分大小写的方式搜索它们:类似

my $regex = '\b(' . join('|', @files), ')\b';
$regex = qr/$regex/ip;

然后依次打开每个文件并使用

进行扫描
while (my ($match) = /$regex/g)
{
    my $original = $lower2original{lc($match)};
    if ($match ne $original)
    {
        print "case mismatch: line $. of $file has $match instead of $original\n";
    }
}

第四:我use File::Find::Rule to obtain the list of files