NAME

open - 入出力のためのデフォルトの PerlIO 層をセットするための perl プラグマ

SYNOPSIS

    use open IN  => ":crlf", OUT => ":bytes";
    use open OUT => ':utf8';
    use open IO  => ":encoding(iso-8859-7)";

    use open IO  => ':locale';

    use open ':encoding(utf8)';
    use open ':locale';
    use open ':encoding(iso-8859-7)';

    use open ':std';

DESCRIPTION

Perl が IO システム(現在のデフォルト)として PerlIO を 使うように設定されている場合、I/O 層としての本格的な対応が 実装されています。

open プラグマはすべての I/O のデフォルトの「層」("layer") (「ディシプリン」"disciplines"とも呼ばれます)を宣言するための インターフェースの一つとして働きます。 2 つの引数を取る open()、readpipe()(または qx//) と同様の演算子は、 そのレキシカルスコープでこのプラグマを見つけると、宣言されたデフォルトを 使用します。 3 つの引数を取る open でさえ、MODE に IO 層が指定されていない場合、 このプラグマの影響を受けます。

IN サブプラグマを使って入力ストリームのデフォルト層を宣言でき、 OUT サブプラグマを使って出力ストリームのデフォルト層を 宣言できます。 IO サブプラグマを使って入出力の両方を同時に制御できます。

レガシーエンコーディングを使っているのなら、:encoding(...) タグが 使えます。

ロケールに関する環境変数に基づいてエンコーディング層を設定したい場合、 :locale タグが使えます。 例えば:

    $ENV{LANG} = 'ru_RU.KOI8-R';
    # the :locale will probe the locale environment variables like LANG
    use open OUT => ':locale';
    open(O, ">koi8");
    print O chr(0x430); # Unicode CYRILLIC SMALL LETTER A = KOI8-R 0xc1
    close O;
    open(I, "<koi8");
    printf "%#x\n", ord(<I>), "\n"; # this should print 0xc1
    close I;

以下の2行は等価です:

    use open ':encoding(utf8)';
    use open IO => ':encoding(utf8)';

同様に、以下の2行

    use open ':locale';
    use open IO => ':locale';

や以下の2行

    use open ':encoding(iso-8859-7)';
    use open IO => ':encoding(iso-8859-7)';

も等価です。

エンコーディング名のマッチングは緩やかなものです: 大小文字の違いは 無視され、多くのエンコーディングはいくつかの別名を持っています。 対応しているロケールのリストと詳細は Encode::Supported を 参照してください。

open() に層のリストが(3 引数文法で)与えられた場合、それらは このプラグマを使って宣言されたリストを上書きします。

:std サブプラグマそれ自身は何の効果ももちませんが、:utf8:encoding といったサブプラグマと組み合わせた場合には、 標準ファイルハンドル(STDIN, STDOUT, STDERR)を、選択された入出力ハンドルの エンコーディングに変換します。 たとえば、入力と出力の両方で :encoding(utf8) を選択した場合、 :std は STDIN, STDOUT, STDERR もまた :encoding(utf8) となることを意味します。 一方、出力だけを :encoding(koi8r) と選択した場合には、 :std は STDOUT と STDERR だけを koi8r にします。 :locale サブプラグマは暗黙のうちに :std を有効にします。

:locale のロジックは encoding に完全に記述されていますが、 短く言うと、まず nl_langinfo(CODESET) を試して、その後 LC_ALL と LANG のロケール環境変数から推測します。

ディレクトリハンドルも将来 PerlIO 層をサポートするでしょう。

非 PerlIO 機能

Perl がその IO システムとして PerlIO を使うように構築されていなかった場合、 :bytes:crlf の二つの擬似層だけが使用可能です。

:bytes 層は「バイナリモード」を、:crlf 層は「テキストモード」を、 ファイルをオープンするときにこれら二つのモードを区別する(Windows を 含めた多くの DOS に似たシステム) プラットフォームにおいて表します。 これら二つの層は binmode() が何も行わないプラットフォームでは何も 行いませんが、PerlIO が有効である場合にはこれらの関数はすべての場所で 動作します。

実装の詳細

PerlIO::Layer に、XS コードで実装された find という クラスメソッドがあります。 これは層の確認のために import によって呼び出されます:

   PerlIO::Layer::->find("perlio")

返り値は、(もし定義されていれば) perlio.c の C プログラムによって 作成された PerlIO::Layer クラスの Perl オブジェクトです。 perl レベルでは現在のところこれを使って何か便利なことが できるわけではありません。

SEE ALSO

"binmode" in perlfunc, "open" in perlfunc, perlunicode, PerlIO, encoding