本来のperlのhello worldは、単純に print "Hello world\n"; 、おしまいである。
しかし敢えて日本語で「こんにちは、世界!」をやっておきたい!!
Perl5.8以降の、マルチバイト扱い手法の概念
これまでクドクドと述べてきたPerlのマルチバイト対応であるが、正直、まだ一部のモジュールで未対応のものがある。
未対応モジュールは use locale; を用いて、日本語、中国語、韓国語等、未対応の言語の場合には例外が発生し、警告し停止するよう記述されている。
一部のブログでは「警告が出ない、古いバージョンのperlの利用」を推奨しているが、これは大きな間違いであり、日本語を流し込むと無警告でフリーズするだけである。
Perl5.8から、Perlでは、内部独自のマルチバイトコード体系を有するとし、UTF-8を含む全てのコードに対して、入力時にデコード、出力時にエンコードが要求されるように変更された。概念図を以下に示す。

また、ソースコードをUTF-8で記述することが求められ、いくつかの専用モジュール使用を宣言しなければならない。
以下に日本語対応の「hello.pl」を例示する。これがPerlで日本語を扱う際のひな型になる。
#!/usr/bin/perl
#perl5.8以降で日本語を扱う場合は、必ずソースをUTF-8で記載すること。
use strict; # 変数宣言をしているか、チェックを厳密にする
use warnings; # 様々な警告を表示させる
use Encode; # マルチバイト文字エンコード用モジュール(必須)
#use Encode::JP::H2Z; # 半角文字、全角文字変換する時に利用(オプション)
use utf8; # ソースをUTF-8で記述する為のモジュール (必須)
#以下3行は、標準入力、標準出力、標準エラーに対する自動エンコードの指示(必須)
binmode STDIN, ":encoding(cp932)"; # 入力なのに、何故かencoding
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
# ファイルハンドル<IN>等からの入力時はdecodeが必要
# ファイルハンドル<OUT>等への出力時はencodeが必要
our $debug=1; # &vv()関数で、値を表示させる(vvは、デバッグ用に僕が開発した関数。便利ですよ。)
# 以下は、スクリプトが実行されているフォルダのフルパスを得る手順
our $ScriptDir=$0; # 実行中のplスクリプトフルパス (cp932コード)
$ScriptDir=&de_sjis($ScriptDir); # ファイルや関数の戻り値等は、手作業でperl内部形式へdecodeする必要がある。
$ScriptDir=~s/[^\\]+\.pl$//; #perlスクリプト名を削除する。
&vv('$ScriptDir',$ScriptDir); # $debug=1の場合のみ、変数名を表示する。
print '日本語で、こんにちは世界!',"\n"; # 標準出力はcp932へ自動でエンコードされる
print '[Finish!]';
<>; # 標準入力待ち(BASICのINPUT文に相当) [Enter]キーを押すまで処理が止まる。戻り値は捨てている。
exit;
#----------------------------------
sub en_sjis
{
my ($buf)=@_;
encode('cp932',$buf);
}
sub de_sjis
{
my ($buf)=@_;
decode('cp932',$buf);
}
sub en_utf8
{
my ($buf)=@_;
encode('utf-8',$buf);
}
sub de_utf8
{
my ($buf)=@_;
decode('utf-8',$buf);
}
sub en_euc
{
my ($buf)=@_;
encode('euc-jp',$buf);
}
sub de_euc
{
my ($buf)=@_;
decode('euc-jp',$buf);
}
sub vv
{
my($Name,$Value)=@_;
if($debug) {
print $Name.'=['.$Value.']',"\n"; #標準出力は自動でcp932にエンコードされる
}
}
とりあえず、実行してみましょう!
コメントに色々説明を書いたけど、意味がわからなくても、とりあえず日本語の「こんにちは!世界!」を拝んでみよう!
秀丸エディタに上記コード部分をコピペする。
これは解説は不要ですね。
【重要】秀丸エディタでutf-8に変換する。
「ファイル」の「エンコードの種類」を見ると、大抵、日本語(Shift-JIS)にチェックが付いていると思う。
Unicode (UTF-8)をクリックする。

すると、以下のようなメニューが現れる。「内容を維持たまま適用」をクリックする。これだけでUTF-8になる。
万一、UTF-8に変換できない文字があった場合には丁寧に指導されるので、適宜対応すること。

デスクトップに「hello.pl」というファイル名で保存する。
これも説明は不要ですね。拡張子を「.pl」にすると、Perlスクリプトになる。
Perlスクリプト「hello.pl」の実行
先に作成したcmd.exeのショートカットをWクリックし、コマンドプロンプトを開く。そこで、「hello.pl」とタイプすると、問題なければ下記のように表示されるだろう。「perl hello.pl」でもよい。問題があれば画面に問題点が指摘される。

問題なく動作するhello.plであれば、ファイルをWクリックするだけでも実行できる。
一応、このスクリプトは、終了前に標準入力を要求するようにしてあるので、[Enter]キーを押すまで画面が表示され続ける。
以上です。