おれのIT日記
2022/12/23 (金)
Perl
日本語の扱い
Perl初心者(わたしも永遠の初心者)が必ず頭を抱えるのが、日本語の扱いです。
ずいぶん昔のような最近のような、ですが、わたしも何度イライラして画面を殴ろうとしたことか…
で、わたしの定番の書き方は、だいたい落ち着いてきました。
前提として、わたしはWindowsで仕事をすることがほとんどであること、Perlスクリプトをutf8(BOMなし)で書くことは、やっと抵抗がなくなってきたこと、があります。
正直に書くと、いまだに愛用エディタはQXエディタでして、これにutf8拡張を導入して使い続けてます。Shift_JISベースの老舗エディタだから、その範囲にない文字は扱えないけど、実のところ日常困ることはまず、無いです。ただ一個だけの不満は、セーブするときに、utf8のBOM付きにしてくれるんですよね。冒頭、いまどきBOMを気にする人も減った気がするのに、わざわざ書いたのはそのためです。だからQXから一発でサクラエディタやVisual Studio Codeを呼べるようにしてあって、必要な時だけ他エディタでセーブしなおす、という、他人から見ると
「なぜ?」
と思うような使い方をしています。
(QX2のことは触れないで次に進む)
自宅サーバはLinuxで、EUC-JPかUTF8。
自宅PCはWindowsばかりで、コマンドプロンプトをいまだに愛用していることもあり、Shift_JISが相変わらず基本。
となると、だいたいこんな書き方で足りるので、近頃は深く考えずにこうしています。
なお、Encode::Guessがハズしてくるときは、あきらめて、$gencにエンコード名をハードコードします。
# わたしがちょちょい、と使い捨てるPerlのひな形~utf8で保存だよ
use utf8;
use Encode;
use Encode::Guess qw/cp932 euc-jp utf8/; # 自分が日常扱う、文字コードの候補。cp932でなくShift_JISでもいいか。
while(<>){
chomp($_);
my $genc = guess_encoding($_) unless $genc; # ファイルごとに自動判定。
$_ = decode($genc, $_);
# ここに処理を。いわゆる「日本語」文字列もバッチリ。
print encode($genc, $_) ."\n"; # 普通は入力エンコード=出力エンコードなので。
}
若い頃にPerlに触れ、Larry Wallの哲学に深く心酔し、一生これだけで自分のやりたいことには充分だと確信したものの、Perl6の成り行きには心底がっかりしました。でも、いまだにRubyやPythonに手を出さないのは、中途半端に別のことを覚えるより、このままPerlを使い続けた方が、それで節約できた時間により、豊かな人生の時間を得られるに違いないという直感によるものです。
(RubyやPythonが中途半端だ、などと言っているのではありませんよ、念のため)
Perlでスッと書けることはPerlでやり、その他のことに時間を使おうと。
会社の隣の人に「Perlってまだあるんだ」と言われてアタマに来ました(笑)
勝手に世の中で持ち上げてPerl、Perlと騒ぎ立てて、こんなものが流行するとは変な世の中だなぁと感じたのもつかの間、数年するとまた勝手に「古い」「良くないプログラムの例」「これからはPython」などなど、勝手にPerlをディスり…世の中は、所詮、軽佻浮薄な輩ばかりが騒ぎ立てる場所、相手しなければいいのですよね。
いま、この言語を使える方は大いに自信をもって、使い続けるのがよろしいです。ほぼ枯れて、開発・実行とも満足のいく速さが得られ、WinでもLinuxでも使える、鉄壁のツールです。この安定感、なかなか無いですよ。