open - 入出力のためのデフォルトの PerlIO 層をセットするための perl プラグマ
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';
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 層をサポートするでしょう。
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 レベルでは現在のところこれを使って何か便利なことが できるわけではありません。
"binmode" in perlfunc, "open" in perlfunc, perlunicode, PerlIO, encoding