5部 関数リファレンス

open

open FILEHANDLE, [EXPR]



openは、ファイルを開くための関数です。第2引数EXPRで指定したファイル名をファイルをオープンして、第1引数FILEHANDLEに対応させます。ファイルハンドル名には慣習的に半角大文字で名前を付けるのが決まりになっています。EXPRを省略すると、FILEHANDLEと同じ名前のスカラ変数にファイル名が入れられているものとして処理されます。

openは、成功時には、0 以外を返し、失敗時には未定義値を返します。

openの使い方

# 一般的な open
open FH, ">filename.txt";

# EXPRを省略
$FH = "filename.txt";
open FH; 

ファイルの読み書きには >、>>、< を使います。ファイル名の前に、以下の記号を付けることにより、モードを指定できます。

  読み取り 書き込み 追加 新規作成 上書き
< filename × × × ×
> filename × ×
>>
filename
× ×
+<
filename
× × ×
+>
filenames
×
+>>
filename
×
command | command
を実行し、その出力をパイプ経由でファイルハンドルを渡す
| command 出力とファイルハンドルをパイプで command に渡す
- STDINをオープン
>- STDOUTをオープン
>& 式がテキストであればファイルハンドルの名前と解釈。数値であればファイル記述子と解釈。

ファイル記述子については用語集「ファイル記述子」を参照してください。

ファイル名の先頭に < を付けるか、何も付けなかった場合には、入力用としてオープンされることになります。> と >> との動作の違いは、> はファイルサイズを0にしてから上書きするのに対し、>> はファイルの終わりにデータを追加します。> や < の前に + を置くことで、ファイルを読み書き両用にすることもできます。

ファイルを開いたあとは、ファイルハンドルを読み込んだり、その内容をprintで他のファイルハンドルに出力したりすることができます。

# ファイルをオープンし、ファイルハンドル FH に関連付け
open FH, ">filename.txt";
# 1行ずつ読み込み処理
while( $line =  ){
	print $line; # ファイルの内容を出力
}
close FH; 

openでパイプ処理

他のプログラムやOSについているコマンドなどからの出力を読み取ったり、逆に出力を渡すために、パイプ出力が使えます。
ファイル名の先頭に | を付けると、そのファイル名をコマンドとして解釈し、そのコマンドへ出力されます。逆にファイル名の最後に | を付けた場合には、同様にファイル名をコマンドと解釈し、そのコマンドの出力を読み込むことができます。

# cat コマンドの出力を読み取る
open( FILE, "cat $text |");
while (  ){
	print;
}
close( FILE ); 

ファイルをパイプを使ってオープンする場合は、ファイルが開けない場合でもエラーを示す未定義値は返ってきません。パイプを作成できなかったときだけ、エラーステータスが返されます。パイプオープンのエラーを捕らえるには、特殊変数

$?を利用します。ファイルハンドルがクローズされると、特殊変数$?にリターンステータスをセーブするので、これを利用します。

open( FILE, "cat $text |");
while (  ){
	print;
}
close( FILE )
if ( $? ){
	print "Can't open $text"; exit;
} 

プロセス間の入出力

現在のプロセスの子プロセスの出力を渡したいときは、open文に引数として|-を渡します。

open( CH, "|-" );

親プロセスからの出力をその子プロセスで出力するには次のようにします。

print <>

逆に、子プロセスから親プロセスに出力を渡すこともできます。親プロセス側ではopenに引数として

-|を渡します。

if( open CH, "-|" ){
	print ;
	close(CH);
} 

子プロセス側ではprintで親プロセスに出力を渡します。

print "...";

詳しくは ファイル入出力、プロセスについては用語集「プロセス」を参照してください。

関連記事