PerlIOレイヤでの処理

まずは次のようにする。

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レイヤというものが何なのか知らない。でも,これを使えば目的が果たせそうだと言うことだけはわかる。