ディシプリンについて 1

id:It_lives_vainly:20080310 で書いた、Perl文字コード変換の話の続きっぽい話です。

さて、perlでは、ファイルハンドルのフォーマットを指定するための、binmodeっていう関数が用意されています。

これは、バイナリファイルなんかを取り扱いたいときにお世話になる関数なんですが、第二引数としてディシプリン(DISCIPLINES)を取ることもできます。

単純に、ディシプリンを指定せずにbinmodeを用いた場合、そのファイルハンドルをバイナリファイルとして扱うことを指定します。

open( IN, '<', 'hoge' );
binmode( IN );

つまり、上のように指定することで、ファイルハンドルの操作に対して、Perlに下手な加工は行わせないということを宣言するわけです。

さて、ディシプリンにはファイルハンドルに対して、どのように文字を加工するかということを指定します。

open( IN, '<', 'hoge' );
binmode( IN, ':encoding(shiftjis)' );

このように指定することで、ファイルハンドルがshiftjis形式で書かれていることを前提に、より適切な変換を行いながら、ファイルの読み込み(書き込み)を行ってくれるわけです。

I/Oディシプリンとして用意されているのは、次になります

ディシプリン* 意味*
:raw バイナリモード
:text デフォルトのテキスト処理
:def "use open"で宣言されたデフォルトに従う
:latin1 ファイルをISO-8859-1として扱う
:ctype ファイルをLC_CYPEとして扱う
:utf8 ファイルをUTF-8として扱う
:utf16 ファイルをUTF-16として扱う
:utf32 ファイルをUTF-32として扱う
:uni Unicodeを判別する(UTF-*)
:any Unicode/Latin1/LC_CTYPEを判別する
:xml ファイルに指定されているエンコーディングを利用する
:crlf 改行文字を判断する(行末を表すシーケンスをすべて\nに変換)
:para 段落モード
:slurp 一揆読みモード
:encoding(shiftjis) 文字エンコードをshiftjisとして扱う
:encoding($enc) 文字エンコード $enc として扱う
(:bytes) (byte文字列として扱う?)

※ :bytes の働きが(私には)良くわからない
※ $enc には、任意も文字コードが入る
※ これ以外にもあるようだ

一番最初に例示した、第二引数を省略した形の binmode は、":raw"と指定するのと同義ということになります。

なお、前回のまとめたように(id:It_lives_vainly:20080310)ディシプリンは、open時にも指定することができます。

open( IN, '

また、必要であればディシプリンは、積み重ねて利用することもできます。

例えば、次のように指定します。

open( IN, '

このように指定することで、

  • shiftjisとしてファイルを読み込み
  • 行末を表すシーケンスをすべて\nとして変換する
  • ファイルを段落単位に分割する($\ = "" と同義)

のような設定を行えます。