文字化けのない世界、文字境界を正確に判別する世界 in Perl:: 例示 全角数字を半角数字に変換 perl/perl6

全角数字を半角数字にPerlで変換する3例。またはPerlにおいて文字化けのない世界実現への基礎(前編)


たぶんこういうことかな、と。以下フォントによっては判別不能かもしれません。置換前は全角、置換後は半角の数字が指定してあります。少しづつ書き足すつもりでしたが、これだけで、書かれていないサンプルコードを察する人が大半なので、そのうち補完。

CTRL+ALT+T

#perl5 tr で単純に
perl5 -pe 'tr|[0-9]|[0-9]|'
#perl5 y オプション::sed互換なので歴史的というべきか。
perl5 -pe 'y|[0-9]|[0-9]|'
#perl6では、yオプションは廃止、trのみになる。
perl6 -pe 'tr|[0..9]|[0..9]|'

なれば、trを利用した書き方だけ覚えればいいのではないか。perl6では各種範囲指定も「..」と現代風に切り替わっていくみたいですね。


考察:全角数字とメタキャラクター

perl6はデフォルトでは、\dに日本語の全角数字がマッチする。このデフォルトが便利なのか便利でないのかはまだわからない。 「壱」「捌」といったものには流石にマッチしない。さて、うまい利用法はないものか。

ワンライナーであれば6と5を気分と用途に合わせて使い分ければいいのでよい利用方法がそのうち浮かぶかもしれない。 闇雲に置き換えても言葉の意味が正式名から俗称にかわる可能性もあるので行政文書などでは考えた上で使うべきですね。

行政に限らず、第二次を第2次と表記替えしたら、リジェクトされるケースもありますね。

例)perl6で全角数字を食わせてみる。

全角であっても数字はアンダースコアに置き換えるというワンライナー。
●Perl6とUTF-8関係モジュール有効Perl5では、全角数字も数字

$ echo 5壱7 | perl6 -pe 's:g|\d|_|'
_壱_

$ echo 5壱7 | perl5 -pe 's|\d|_|g'
_壱_

●UTF-8関係モジュール無効では、全角数字はただの文字

$ echo 5壱7 | perl -pe 's|\d|_|g'
5壱7

●UTF-8モジュールは、UTF-8ソースだよという宣言のみ※1

$ echo 5壱7 | perl -Mutf8 -pe 's|\d|_|g'
5壱7

●UTF-8::all モジュールは、日本人にとってほぼ万能。超オススメ

$ echo 5壱7 | perl -Mutf8::all -pe 's|\d|_|g'
_壱_

●Cオプション、これを知らないでPerlのUTF-8環境は語れない。

$ echo 5壱7 | perl  -CIO       -pe 's|\d|_|g'
_壱_

注) 僭越ながら「UTF-8ソースだよという宣言のみ※1」でそれ意外に期待してはいけないと明記してあると思うのですが、手持ちの超スーパー日本人ユーザーの書籍でも、職業プログラマーが集まるサイトでも、??な記述を見かけました。たまたま通っても、それは副作用ではないでしょうか、と思います。そのうち別稿をまとめたいと思っています。

どこにヒント(というか、言明)が書いてあるかですが、Perldoc です。英語でもたまには読みましょう(自戒も含め)。勘違いならご指摘ください。自分の解釈を優先してから、Perlにおける日本語の扱いはパーフェクトになりました。


というさまざまな挙動は覚えておかないととんでもないことが起きるかもしれませんね。
抑止「a」などは公式サイトをご覧ください。perl5 は オプション付きエイリアスです。
気がついたのは、Perlクックブックだったかなで、直截ではないけれど、なんとなく。使えるようになった。なんかロケール絡みなのだけど、斜め読みなので、そのうち整理。