せらんメモスマートフォン用の表示で見るぱせらんメモこの広告は、90日以上更新していないブログに表示しています。2009-09-09PerlIOのレイヤについてまとめてみたPerlPerlIOがいつまでたってもきちんと理解できず、毎回試行錯誤しながら適当に指定してしまうのできちんと調べてみた。調べてみて一番の収穫だったのは、レイヤは主に三種類に分けられる、ということ。ドキュメントでは順不同で出てくるのでごっちゃになって混乱していたが、こうして分類してみると自分の望むものが何なのかよくわかるようになった。リソースアクセス系これはリソースに対して実際にIOを行うレイヤ。write()等を使うレイヤ。バッファリングしない。どのプラットフォームでも常にO_BINARYで扱う。descriptorの代わりにWindowsネイティブのハンドルを使うレイヤ。5.10.0現在のリリースではバグっぽいことがわかっているらしい。:stdioシステムのstdioライブラリを使うレイヤ。バッファリングされる。perlrunにはCRLF変換は行われないって書いてあるけど、StrawberryPerlで試したら変換されたんだが。:mmapmmap()を使ってファイルをプロセスのアドレス空間にマップしてアクセスするレイヤ。:scalarスカラ変数を入出力にマップするレイヤ。リソース加工系これはデータを加工するレイヤ。:perliostdioのようなバッファリングをPerlIOとして実装したレイヤ。:crlfMS-DOS/WindowsのようなCRLFと\nの変換を行うレイヤ。:encodingエンコーディング変換を行うレイヤ。stringの変換を透過的に行う。:viaPerlで書かれた透過的IO処理を扱うためのレイヤ。一言で言えばフィルタ。サンプルとして標準でPerlIO::via::QuotedPrintがある。PerlIO制御系これらの擬似レイヤはレイヤスタックには乗らずに、PerlIOに対して様々な制御(フラグの変更など)を行う。:raw一般的には、各レイヤでの変換を無効化して、バイナリデータをそのまま扱うように他のレイヤに伝える擬似レイヤ。内部的には全てのレイヤで独自のbinmodeフックがあればそれを呼び出し、なければそのレイヤを削除する。':raw')は等価。「:crlfの逆」というのは過去の話であって、今は上記のとおり単なるCRLF変換の無効化ではない。utf8)であることを伝える(フラグをonにする)擬似レイヤ。妥当性についてはチェックされないので、UTF-8のデータを読み込みたい場合は:encoding(utf8)を使うことが推奨されている。:bytes:utf8の逆で入力をoctetとして扱うことを伝える擬似レイヤ。utf8を流し込むとwarnを発する。:pop最上位にあるレイヤを取り除くための擬似レイヤ。当然ながらレイヤスタックに積まれない擬似レイヤ(:utf8など)に対しては使えない。各プラットフォームのデフォルトUNIXでは:unix:perlioまたは:stdioがデフォルト。Win32では:unix:crlfがデフォルト。将来的には:win32がデフォルトになる予定らしい。デフォルトのPerlIOを設定する環境変数PERLIO全てのPerlIOに対して影響するため、組み込みのレイヤのみが使える。:encodingのような外部読み込みレイヤは、それ自身のIOが必要なため指定できない。openプラグマopenプラグマを使うことでデフォルトレイヤに:encodingなども指定できるようになるが、トラブルの元なので使わないほうがよいと思われる。use/requireにも影響が出るので、読み込んだモジュールのリテラルが壊れたりする。その他の拡張レイヤこれらの他にCPANには色々なPerlIO拡張がある。PerlIO::gzipとかはありがちだけど、PerlIO::Utilに含まれている:teeとかは面白そう。{...2008-10-03Unicodeでの正規表現http://kjirou.sakura.ne.jp/mt/2008/10/python_unicode.html例...2008-05-05脱秀丸。Pi(Raspbian)にmDNSを設定するSassとCompassを使ってみるbinaryへのキャストって......?月別アーカイブはてなブログをはじめよう!paselaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。