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 "...";