2

私は、CORBAを広範囲に使用する巨大なJavaコードベース(10,000を超えるJavaクラス)を持っています(ただし、その使用法に関するドキュメントはありません)。

CORBAの使用法を理解するための最初のステップとして、コードベース全体をスキャンし、パターン「org.omg.CORBA」を含む一意の行を抽出/印刷することにしました。これらは通常、importステートメントに含まれています(例:import org.omg.CORBA.xyz)。

私はPerlの初心者であり、WindowsOSでこれらの詳細を抽出できる方法があるかどうか知りたいです。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がここで最良の解決策であるかどうかはわかりません。cygwinを使用するというnhahtdhの提案は良いものです。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 に答える
2

楽しみのために、これを行うためのperlワンライナー:

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

これは、最初に行が一致するかどうかをチェックし、次に行を印刷する前にそれが表示されていないかどうかをチェックします。これは、指定されたすべてのファイル(この場合は「*」)に対して行われます。

于 2012-06-14T14:20:37.510 に答える