要約
マルチバイト文字を扱うワンライナはとりあえず-CSDとでもしておくと安心。
長文
どう書く?orgでバイナリクロックのお題に解答したら、あの小飼弾氏がさらに短くして下さいました。うはー!
perl -CIO -Mutf8 -le 'print for map { $_ = sprintf "%06b", $_; tr/01/□■/; $_ } (localtime)[2,1];'
Perl5.8対応(そうか、-lで$\
出力だった)はともかく-Cスイッチって何ぞや、と思ったのでperldoc perlrun:
−C [number/list] The "−C" flag controls some of the Perl Unicode features.
「Perl5.8.1より前はWin32のワイド版APIを使うためのスイッチだったけど、誰も使わなかったから使い回すことにしたよ」とか中々楽しいことが書いてあり、現在はPerlIOレイヤを操作するスイッチになっているそうです。
以下簡単な説明。
-C(I|O|E|S)
-C(I|O|E)はそれぞれ標準(入力|出力|エラー出力)のPerlIOレイヤをUTF-8に設定するオプションです。つまり次のコードと等価になります:
binmode STDIN, ':utf8'; # -CI
binmode STDOUT, ':utf8'; # -CO
binmode STDERR, ':utf8'; # -CE
また-CSオプションで、これらをまとめて指定できます。
-C(i|o|D)
-C(i|o)はそれぞれ読み出し(<)、書き込み(>)用に開くファイルハンドルに適用されるデフォルトのPerlIOレイヤをUTF-8に指定します。-CDは両者の一括指定。それぞれopen
プラグマを使った以下のコードと等価です:
use open IN => ':utf8'; # -Ci
use open OUT => ':utf8'; # -Co
use open IO => ':utf8'; # -CD
-CA
@ARGV
の内容にUTF-8フラグを立てます。コマンドライン引数でUnicode文字列を渡す場合(あるか?)に。
-CL
ロケールに関する環境変数LC_ALL
、LC_TYPE
、LANG
をこの順に見ていき、存在する最初の値が"UTF-8"であったときのみ-Cオプションの指定を有効にします。
例えば-CSDALとすると、ロケールがUTF-8であった場合のみ-CSDAが有効になります。
-Ca
${^UTF8CACHE}
を-1に設定します……よく分かりません。デバッグ用のオプションのようです。
"to run the UTF−8 caching code in debugging mode."とあるので、Unicode文字列のキャッシング機構をデバッグモードにするとかそんな意味でしょうか。
コメント
コメントを投稿