スキップしてメイン コンテンツに移動

Perl - -CスイッチでPerlIOレイヤを操作

要約

マルチバイト文字を扱うワンライナはとりあえず-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_ALLLC_TYPELANGをこの順に見ていき、存在する最初の値が"UTF-8"であったときのみ-Cオプションの指定を有効にします。

例えば-CSDALとすると、ロケールがUTF-8であった場合のみ-CSDAが有効になります。

-Ca

${^UTF8CACHE}を-1に設定します……よく分かりません。デバッグ用のオプションのようです。

"to run the UTF−8 caching code in debugging mode."とあるので、Unicode文字列のキャッシング機構をデバッグモードにするとかそんな意味でしょうか。

コメント