PerlでのUTF-8 Shift-JIS あれこれ

PerlScriptをUTF-8で記述する場合、読み込み先ファイルがShift-JISの場合の文字化け問題や、そのままだとifの-fオプションが扱えなかったりと、色々と面倒です。
私の場合、ピンポイントに以下のコーディング方法について、調査に時間がかかったので、知識を共有します。

  • 標準入出力・エラーをShift-JISにする
  • WindowsDOSコマンド、DIRの結果をパイプする
  • ifで-fオプションを利用する
  • Shift-JISで記述されたファイルを読む
  • Shift-JISでファイルを書く
  • UTF-8でファイルを書く
#!D:/usr/local/Perl/bin/Perl.exe

use utf8;
use Encode;

print "Content-type: text/html\n\n";
print <<EOM;
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>TEST</title>
</head>
<body>
<pre>
EOM

# まだ標準出力がUTF-8なので、Shift-JISにエンコードしてます。
	print Encode::encode('shiftjis',"--- このHTMLドキュメントはShift-JISです ---\n");

#***
# 標準入出力・エラー
#  標準出力 UTF-8 -> Shift-JIS
	print Encode::encode('shiftjis',"◆標準出力をShift-JISにします。\n");
	binmode STDOUT,':encoding(shiftjis)';

#  標準エラー UTF-8 -> Shift-JIS
	print "◆標準エラーをShift-JISにします。\n";
	binmode STDERR,':encoding(shiftjis)';

#  標準入力 Shift-JIS -> UTF-8
	print "◆標準入力をShift-JISで受け取り、UTF-8に変換します。\n";
	binmode STDIN,':encoding(shiftjis)';
#***

#***
# ファイルの有無を検査
#  Shift-JIS ( if(-f ***) ) -> UTF-8 (このScript)
	print "◆ファイルの有無を検査します。\n";
	if(-f Encode::encode('shiftjis',"有無を確認するファイル.txt")){
		print "有無を確認するファイル.txtは、あります。\n";
	}else{
		print "有無を確認するファイル.txtは、ありません。\n";
	}
#***

#***
# DIRコマンドの結果を取得し表示
#  Shift-JIS (DIRコマンド) -> UTF-8 (このScript) -> Shift-JIS (標準出力)
	print "◆DIRコマンドの結果を取得し表示します。\n";
	if(! open(fp,"DIR /B C:\\|")){
		print "DIRコマンドが実行できませんでした。\n";
		exit(1);
	}
	while(<fp>){
		push(@line,Encode::decode('shiftjis',$_));
	}
	close(fp);

	foreach(@line){
		print $_;
	}
#***

#***
# Shift-JISのファイル読み込み
#  Shift-JIS (sjis_in.txt) -> UTF-8 (このScript)
	print "◆Shift-JISのファイルを読み込みます。\n";
	if(! open(in,"sjis_in.txt")){
		print "sjis_in.txtを読めませんでした。\n";
		exit(1);
	}else{
		print "sjis_in.txtを読み込みました。\n";
	}
	while(<in>){
		push(@in,Encode::decode('shiftjis',$_));
	}
	close(in);
#***

#***
# Shift-JISでファイル書き出し
#  UTF-8 (このScript) -> Shift-JIS (sjis_out.txt)
	print "◆Shift-JISのファイルを書き出します。\n";
	if(! open(out,">sjis_out.txt")){
		print "sjis_out.txtを書けませんでした。\n";
		exit(1);
	}else{
		print "sjis_out.txtを書き込みました。\n";
	}
	foreach(@in){
		print out Encode::encode('shiftjis',$_);
	}
	close(out);
#***

#***
# UTF-8でファイル書き出し
#  UTF-8 (このScript) -> UTF-8 (utf8_out.txt)
	print "◆UTF-8のファイルを書き出します。\n";
	if(! open(out,">utf8_out.txt")){
		print "utf8_out.txtを書けませんでした。\n";
		exit(1);
	}else{
		print "utf8_out.txtを書き込みました。\n";
	}
	foreach(@in){
		print out $_;
	}
	close(out);
#***

print "おしまい";
print <<EOM;
</pre>
</body>
</html>
EOM

exit(0);