perl 脚本来搜索 java 源代码中区分大小写的文件名

Posted

技术标签:

【中文标题】perl 脚本来搜索 java 源代码中区分大小写的文件名【英文标题】:perl script to search java source code for case (in)sensitive file names 【发布时间】:2014-12-15 04:45:20 【问题描述】:

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

我最初考虑使用 ACK,但这里的防火墙似乎阻止了 CPAN,并且它一直无法使用 dmake 在我的计算机上手动安装。 (使用最新版本的草莓)

到目前为止,这是我能够汇总的内容,它递归地搜索基本路径下的每个子目录,获取 java 和 xml 文件。然后它将打开找到的每个文件并对源列表中的每个名称进行不区分大小写的搜索,然后对搜索结果进行区分大小写的匹配以删除大小写相同的结果,然后将否定结果存储在每个源文件(键)都有一个数组(值)存储每个文件的名称,其中发现案例与文件名不匹配。最后我打算打印出哈希。

我目前难以设置数组的哈希值,但我愿意接受替代/更简单的解决方案。

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】:

你的道路很好,但你可以改进。

首先:行

%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 = $lower2originallc($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。

【讨论】:

我打算将该行转换为将结果内容添加到我们要查找的名称的哈希中的内容。但我确信我会遇到内存处理问题。 看起来好像while (my ($match) = /$regex/g) 永远不会传递为真的。我的猜测是它的正则表达式不正确我遵循了上面的内容,尽管我不知道修饰符 p 是什么? $regex = qr/$regex/ip; 之后的正则表达式如下所示 (?^pi:\b(FileA|FILEB)\b) 我没有尝试我的代码。我什至不知道你是否需要the p there。您可能必须将g 添加到qr 调用中。所以有些细节可能是错误的,但是方法应该可行。 已解决问题,感谢您的帮助!我最终将 while (my ($match) = /$regex/g 拆分为 while (&lt;f&gt;)if(my ($match) = /regex/g) 与 $match 和 $_ 在原始 while 循环中不起作用 太棒了……抱歉,我以为您已经阅读了输入内容。

以上是关于perl 脚本来搜索 java 源代码中区分大小写的文件名的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++ 中区分大小写的短语搜索

java中区分大小写吗???

Spark 中区分大小写的连接

Eclipse 或 Notepad++ 中区分大小写的字符串替换

.emacs 中区分大小写的 setq 无效

在 Java 的 JTextArea 中区分拖动和选择