広告 プログラミング言語-Perl

4 Windows Strawberry PerlでHello world

本来のperlのhello worldは、単純に print "Hello world\n";  、おしまいである。
しかし敢えて日本語で「こんにちは、世界!」をやっておきたい!!

Perl5.8以降の、マルチバイト扱い手法の概念

これまでクドクドと述べてきたPerlのマルチバイト対応であるが、正直、まだ一部のモジュールで未対応のものがある。
未対応モジュールは use locale; を用いて、日本語、中国語、韓国語等、未対応の言語の場合には例外が発生し、警告し停止するよう記述されている。

一部のブログでは「警告が出ない、古いバージョンのperlの利用」を推奨しているが、これは大きな間違いであり、日本語を流し込むと無警告でフリーズするだけである。

Perl5.8から、Perlでは、内部独自のマルチバイトコード体系を有するとし、UTF-8を含む全てのコードに対して、入力時にデコード、出力時にエンコードが要求されるように変更された。概念図を以下に示す。

PERLのマルチバイト取り扱い概念図

また、ソースコードを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)をクリックする。

秀丸エディタ1

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

秀丸エディタ2

デスクトップに「hello.pl」というファイル名で保存する。

これも説明は不要ですね。拡張子を「.pl」にすると、Perlスクリプトになる。

Perlスクリプト「hello.pl」の実行

先に作成したcmd.exeのショートカットをWクリックし、コマンドプロンプトを開く。そこで、「hello.pl」とタイプすると、問題なければ下記のように表示されるだろう。「perl hello.pl」でもよい。問題があれば画面に問題点が指摘される。

pl実行イメージ

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

以上です。

-プログラミング言語-Perl