2

我有一个庞大的 Java 代码库(超过 10,000 个 Java 类),它广泛使用了 CORBA(虽然没有关于其使用的文档)。

作为弄清楚 CORBA 用法的第一步,我决定扫描整个代码库并提取/打印包含模式“ org.omg.CORBA ”的唯一行。这些通常在导入语句中(例如 import org.omg.CORBA.xyz)。

我是 Perl 的新手,想知道是否有办法在 Windows 操作系统上提取这些详细信息。我需要能够扫描所有具有 java 类的文件夹(和子文件夹)。

4

3 回答 3

4

您可以在单行中使用File::Find :

perl -MFile::Find -lwe "
    find(sub { if (-f && /\.java$/) { push @ARGV,$File::Find::name } },'.'); 
    while(<>) { /org.omg.CORBA/ && $seen{$_}++; }; 
    print for keys %seen;"

请注意,此单行使用 Windows 所需的双引号。

这将递归搜索当前目录以查找具有扩展名的文件.java并将它们添加到@ARGV数组中。然后我们使用菱形运算符打开文件并搜索字符串org.omg.CORBA,如果找到,则将该行作为键添加到%seen哈希中,这将有效地删除重复项。最后一条语句打印出散列中的所有唯一键。

在脚本形式中,它看起来像这样:

use strict;
use warnings;
use File::Find;

find(sub { if (-f && /\.java$/) { push @ARGV,$File::Find::name } },'.');
my %seen;
while(<>) {
    /org.omg.CORBA/ && $seen{$_}++; 
}
print "$_\n" for keys %seen;"
于 2012-06-14T15:57:28.800 回答
2

只是为了好玩,一个 perl 单线来做到这一点:

perl -lne '/org.omg.CORBA/ and (++$seen{$_}>1 or print)' *

这首先检查一行是否匹配,然后在打印出该行之前是否没有看到它。对所有指定的文件(在本例中为“*”)执行此操作。

于 2012-06-14T14:20:37.510 回答
2

我并不是要逆势而为,但我不确定 perl 是这里的最佳解决方案。nhahtdh 的使用cygwin的建议是一个很好的建议。grep 或 find 确实是您想要的。在这种情况下使用 perl 将涉及使用File::Find然后在每个文件上打开一个文件句柄。这当然是可行的,但如果可能的话,我建议使用正确的工具来完成这项工作。

find . -name "*.java" -type f | xargs grep -l 'org.com.CORBA' | sort | uniq

如果你真的必须使用 perl 来完成这项工作,我们可以处理 File::Find 代码。

于 2012-06-14T14:41:18.877 回答