open FILEHANDLE,EXPR / open FILEHANDLE

広告

広告

解説

EXPR でファイル名を指定するファイルをオープンして、FILEHANDLE に対応させます。FILEHANDLE が式のときにはその値が実際に使用するファイルハンドルの名前として使われます。EXPR を省略するとFILEHANDLE と同じ名前のスカラ変数にファイル名が入れられているものとして処理されます。

ファイル名の先頭に "<" を付けるか何も付けなかった場合には入力用としてオープンされることになります。

先頭に ">" を付けるとファイルは出力用にオープンされます。

同じように ">>" を付けるとアペンド用にオープンされます。

">" や "<" の前に "+" を置くことで、ファイルを読み書き両用とすることもできます。ファイル名の先頭に "|" を付けるとそのファイル名をコマンドとして解釈し、ファイルハンドルへの出力がパイプを通じてそのコマンドへ入力されます。逆にファイル名の最後に "|" を付けた場合には、同様にファイル名をコマンドと解釈しそのコマンドの出力がパイプを通じてファイルハンドルから入力として読み込むことができるようになります。ただし、入出力両用にパイプするコマンドは使えません。

"-"を open すると STDIN がオープンされ、">>-" を open すると STDOUT がオープンされます。open は成功時にはゼロ以外を返し、失敗時には未定義値を返します。パイプに関る open のときには返却値はサブプロセスの pid となります。

Bourne シェルの慣例にしたがって、EXPR の先頭に ">&"を付けるとEXPR の残りの文字列をファイルハンドル名(数字であれば、ファイル記述子)と解釈し、それを dup してオープンします。"&" は、">"、">>"、"<"、"+>"、"+>>"、"+<" というモード指定に付けることができます。指定するモード指定はもとのファイルハンドルのモードと合っていないとなりません。

N を数値として、"<&=N" と指定するとPerl は、そのファイル記述子に対するC の fdopen() と同じことを行ないます。たとえば

open(FILEHANDLE, "<&=$fd")

"-|" や "|-" というふうに、"-" というコマンドにパイプをオープンすると、fork が行なわれ、open の返却値として、親プロセスにはチャイルドプロセスの pid が、チャイルドプロセスには 0 が返されます。open が成功したかどうかは、defined($pid) のようにして調べることができます。親プロセスではこのファイルハンドルは通常通りに動作しますが、行なわれる入出力はチャイルドプロセスの STDIN/STDOUT にパイプされます。チャイルドプロセス側ではそのファイルハンドルはオープンされず、入出力は新しい STDOUT か STDIN に対して行なわれます。これはsetuid で実行してシェルコマンドのメタ文字を検索させたくないような場合にパイプコマンドの起動の仕方を制御したいとき普通のパイプの open と同じように使います。

パイプのファイルハンドルを明示的に close することで親プロセスは、チャイルドプロセスの終了を待ち、$? にステータス値を返します。オープンするために渡されたファイル名ははじめと終わりの空白が取り除かれます。妙な文字が含まれているようなファイル名をオープンするには、次のようにして最初と最後の空白を保護した方がよいでしょう。

$file =~ s#^(\s)#./$1#;
open(FOO, "< $file\0");

使用例

ソース

$IN = 100;
open IN or die "Can't find article $ARTICLE: $!\n";
while (<IN>) {...

open(LOG, '>>/usr/spool/news/twitlog'); # (log は予約語)

open(article, "caesar <$article |");    # 記事の復号

open(extract, "|sort >/tmp/Tmp$$");     # $$ は現 pid

open(FOO, "|tr '[a-z]' '[A-Z]'");
open(FOO, "|-") || exec 'tr', '[a-z]', '[A-Z]';

広告

Copyright (C) 2003-2006 七鍵 key@do.ai 初版:2003年07月07日 最終更新:2006年08月08日