技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

指定したディレクトリ配下のファイルから改行コード LF を探し出すスクリプト

引数で指定したディレクトリ配下のファイルから改行コード 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; # If not, all linefeeds are changed to "LF" inside Perl.

        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; # for output.
    
    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 のまま扱われるので、改行コードを正しく判定できる。