引数で指定したディレクトリ配下のファイルから改行コード LF を探し出すperlスクリプト detectLF.pl を作成した。
使い方は簡単で、「perl detectLF.pl "ディレクトリ"」を実行するだけ。
use strict;
use warnings;
my $dir = $ARGV[0];
if(! -d $dir) {
die "Invalid argument.";
}
my @fileList;
getFileList($dir, \@fileList);
foreach my $file (@fileList) {
if(-f $file) {
open(my $fh, $file);
binmode $fh;
my $lineNum = 1;
foreach my $line (<$fh>) {
if($line =~ /[^\x0d]\x0a$/) {
print("$file has LF in line $lineNum.\n");
}
$lineNum++;
}
}
}
sub getFileList {
my $dir = shift;
my $ref_fileList = shift;
opendir(my $dh, $dir);
my @fileList = readdir($dh);
closedir($dh);
foreach my $file (sort @fileList) {
if($file =~ /^\.{1,2}$/) {
next;
}
if( -d "$dir/$file") {
getFileList("$dir/$file", $ref_fileList);
}
else {
push(@$ref_fileList, "$dir/$file");
}
}
}
実行結果は、
C:\Users\testdir/test.txt has LF in line 1.
C:\Users\testdir/test1.txt has LF in line 1.
・・・
のように表示される。
ちなみに、ファイル読み込みの時、
binmode $fh;
としてバイナリモードで読み込んでいる。これがないと、perlの内部でファイルから読み込んだ改行コード CRLF が勝手に LF に変換されるようで、CRLF も LF として検知してしまうため、こうしている。
上記のようにバイナリモードで読み込むと、perl の内部で改行コードの変換が起きず、CRLF は CRLF のまま扱われるので、改行コードを正しく判定できる。