まずは次のようにする。
use strict;
use warnings;
これはおまじないのように入れておく。
次に,これもわたしの定番。
use utf8;
ここからが本命。
use Encode;
これにより,openなどで3引数形式にしてエンコードが指定できる。
なお,Windowsでは標準出力や標準エラーがcp932なので次のようにしておく。
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
続いてディレクトリ操作の例を。opendirに渡す文字列は,たとえば,次のようにcp932にエンコードする。
my $cp932_dirname = encode("cp932", $dirname);
opendir(my $DIR, $cp932_dirname) or die "$dirname: $!";
また,readdirからの文字列は,たとえば,次のようにutf-8にデコードする。
foreach my $cp932_entry (readdir($DIR)) {
my $entry = decode("cp932", $cp932_entry);
}
ファイルテスト演算子に渡す文字列も,たとえば,次のようにcp932にエンコードする。
-d encode("cp932", $filename)
use utf8; としているので,ファイルの出力はutf-8になるはずだが,わかりやすいように,たとえば,次のように明示的に書いておくとよい。
open(my $OUT, ">>:utf8", "list.html") or die;
以上は,わたしが受けたレクチャそのまま。つまり受け売り。正直言うと,PerlIOレイヤというものが何なのか知らない。でも,これを使えば目的が果たせそうだと言うことだけはわかる。