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;
以下のものは
use open ':encoding(utf8)';
use open IO => ':encoding(utf8)';
以下のものおよび
use open ':locale';
use open IO => ':locale';
以下のものと等価です
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