お約束

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;

日本語を扱う可能性があるプログラムのすべて(つまり、文字列処理をするプログラムの全て)に書いておくと幸せになれるらしいです。

Perl内部のUTF-8とUTF-8

文字列がUTF-8ならUTF-8じゃないか?と思いがちですが、Perlには内部で扱う"flagged UTF-8"と"flaggedではないUTF-8" (文字列ではない) の二種類があることを覚えておきましょう。

文字列を扱う時は、Perl内部で扱うflagged UTF-8へdecodeで変換し、Perlの外部に出力する時にはencodeしてやる必要があります。例えば、ターミナルから入力されるひらがなをカタカナに変換する場合は、次のようになります。

use strict;
use warnings;
use utf8;
use Encode;

my $hoge = <>;
my $decoded_hoge = decode_utf8($hoge);
$decoded_hoge =~ tr/ぁ-ん/ァ-ン/;
print encode_utf8($decoded_hoge);

これでたいていの処理は問題なくできるはずです。

参考