[kansaipm] Perl 5.6 ネタ

mishima at momo.so-net.ne.jp mishima at momo.so-net.ne.jp
Tue Apr 4 18:01:40 CDT 2000


三嶋です。

最近 Perl 5.6 (ActivePerl Build 613) で遊んでます。

Perl 5.6 の目玉と言えば、utf8 です。
これを試してみたので、ちょっと紹介します。

#UTF8というのは大雑把に言うと、各文字2バイトのいわゆるUnicodeを、ASCII 
#文字はそのまま1バイトに、その他の文字は2バイト以上になるよう、独特の
#規則で変換をかけたものです。日本語は1文字当たり3バイトになります。
#ASCII文字に限って言えば、従来のテキストと互換性があるので、元の
#Unicodeよりは使いやすいというわけです。

まず、Perl の utf8 プラグマのマニュアルには、ソース中のほとんどのリテ
ラルに UTF-8 の文字を使うことができるというようなことが書いてあります。

Bytes in the source text that have their high-bit set will be treated
as being part of a literal UTF-8 character. This includes most
literals such as identifiers, string constants, constant regular
expression patterns and package names.

そこで、以下のような短いコードをUTF8に変換して保存後実行してみました。
# Jcode.pm は別途追加でインストールしました。

use Jcode;
use utf8;
my $日本語 = new Jcode("日本語の表示\n",utf8)->sjis;
print $日本語;

すると、日本語の変数名も問題を起こさず、ダブルクォートで囲まれた日本語
も化けずに「日本語の表示」とSJISコードで表示してくれました。(^^)v


#ご存知の方もおられるかと思いますが、SJISの「表」は2バイト目が「\」と
#同じコードです。これがダブルクォートの中で次の文字(「示」の1バイト目)
#とくっついてしまうと、「侮」という文字に化けます。それじゃあ、ってんで
#シングルクォートを使って、print '日本語の表示\n'; などと書くと、\n が
#そのまま表示されてしまいます。SJIS環境では侮れない問題です。
#(普段は print '日本語の表示'."\n"; などと書くようにしてます)

さて、サンプルとしてはとりあえずこれでいいとのですが、UTF8 を実際のスク
リプトで使用しようとすると、現状ではまだいろいろ不便を感じます。

まず、I/O の都度外部の文字コードと UTF8 との間で文字コード変換を行う必
要があります。上記の例では、出力時に Jcode を明示的に使って UTF8から
SJIS に変換しています。これは数が増えると書くのも面倒ですし、見た目にも
冗長です。
ちなみに、新しく追加された open プラグマのマニュアルによると、ファイル
ハンドル毎にopen の際に、I/O時の改行コード変換の有無を指定できるようで
す。将来、そういうノリで文字コードの変換を指定できたら幸せになれると思
うのですが、どうかなあ。

また、UTF8 対応のエディタを持っていない場合、実行前にスクリプトの文字
コードを変換しておく必要があります。上記の例では、Jcode を使った別スク
リプトでサンプルのスクリプトをあらかじめUTF8に変換しておきました。
これについては、Filterというモジュールを使えば...ってあれぇ、マニュア
ルは入っているのに、Filter モジュール本体が入っていません。とにかく、
Filterというモジュールを使うと、スクリプトはSJISなりEUCで書いておいて、
コンパイル直前にUTF8に変換して実行するということができるはずです。但し、
それなりの負荷はかかります。


以上。何かの参考になれば幸いです。

ところで舟木さん、fj.comp.lang.perl で前田さんに言われてましたけど、
perldoc の使い方覚えた?(^^)

--
$p='Perl'; $_='Masahiro Mishima'; sub _{pack'c*',$x=110+ at _*5,$x+1}
tr/oma/fa_/;s/./chr(ord($&)+2)/ge;@x=(sort(grep{!$_{$_}++}split//),
$p=~/(.(..).)/);$x[7]=~s/^/_/e;$x[8].=_ 1;for(@w=(47,1639,8,31259))
{s/\d/$x[$&+1]/g} print ucfirst "@w.\n";



More information about the Kansai-pm mailing list