perl - 改行コードを変更する

 
1. 改行コードを変更する

1. 改行コードを変更する

 これは世界中のあらゆるところで発生するんでしょうな。  MAC の改行コードは CR と書いてあるが、よくよく調べてみると MacOS 9 までのことだそうで、それより後は LF なのだそうだ。  今んとこ(2017年10月25日現在)、unix 系では LFWindows 系では、CRLF ゆえ、日本以外であっても、処理系の違う者同士でテキストファイルのやりとりが発生すると、改行コードの変換が発生するわけです。  いろんなとこに書いていますが、perlruby はたまた sed を使用すれば、ワンライナーで変換できる・・・と。  perl でやるならこんな感じのようですが・・・。

perl -pe 's/\r//'     変換前.txt  > 変換後.txt   ← CRLF から LF への変換
perl -pe 's/\n/\r\n/' 変換前.txt  > 変換後.txt   ← LF から CRLF への変換
 これだと変換前と変換後のファイル名を変えなきゃならないのでちょっと面倒だったのです。  なのでスクリプトにしよう・・・と。

#!/usr/bin/perl
use strict;
use IO::File;

#	CR/LF を LF に置き換える

sub main
{
	my @argv = @_;
	my $root = $argv[0];

	my $filelist = &get_files($root);

	foreach my $name (sort(@$filelist))
	{
		&toLF($name);
	}
}

#	パス付ファイル名を取得する
#	拡張子のチェックもここで行う

sub get_files
{
	my $dir = shift;
	my $filelist = shift;

	opendir (DIR, "$dir");
	my @list = grep /^[^\.]/, readdir DIR;
	closedir DIR;

	foreach my $file (@list)
	{
		#	ディレクトリの場合は再帰検索を行う

		if (-d "$dir/$file")
		{
			$filelist = &get_files("$dir/$file", $filelist);
			next;
		}

		#	ファイルの場合は拡張子が txt ならばリストする

		if ($file =~ /txt$/)
		{
			push @$filelist, "$dir/$file";
		}
	}

	return $filelist;
}

#	テキストファイルの改行 CRLF を LF にする
#	拡張子はここまででチェック済

sub toLF
{
	my $name = shift;
	my $fh = IO::File->new();

	$fh->open($name, "r") or die "$!";
	my @allline = <$fh>;
	$fh->close();

	my $read = undef;

	foreach my $line(@allline)
	{
		$read .= $line;
	}

	#	全行 CRLF を LF に変換

	$read=~ s/\r//g;

	$fh->open($name, "w") or die "$!";
	print $fh $read;
	$fh->close();
}

main(@ARGV);
 下記で実行すると

> ./ソースファイル.pl ディレクトリ
 指定したディレクトリ配下の .txt ファイルの改行がすべて CR になります。