open
open FILEHANDLE, EXPR
open FILEHANDLE, MODE, EXPR
open FILEHANDLE, MODE, EXPR, LIST
open FILEHANDLE, MODE, REFERENCE
open FILEHANDLE
EXPRで指定されたファイルをオープンしてFILEHANDLEに結びつけます。MODEがパイプモードの場合は、EXPRで指定されたコマンドを実行します。
MODEがパイプモードの場合、LISTがコマンドラインオプションとしてコマンドに渡されます。
第三引数がREFERENCEの場合、インメモリファイルを利用することができます。
MODEには以下のものを指定することができます。
MODE | 説明 |
---|---|
< | 読み込み |
> | 上書き |
>> | 追加書き込み |
+< | 読み書き両用(既存ファイルがない場合エラー) |
+> | 読み書き両用(既存ファイルがある場合上書き) |
+>> | 読み書き両用(既存ファイルがある場合追記) |
|- | 出力をコマンドに渡す(パイプモード) |
-| | コマンドの出力を受け取る(パイプモード) |
サンプルプログラム
# ファイルのデータを読み込む use strict; use warnings; my $filename = 'document.txt'; open my $fh, "<", $filename or die "$!:$filename"; while (my $line = <$fh>) { print $line; } close $fh;
# ファイルに追加書き込みする use strict; use warnings; my $filename = 'data.txt'; open my $fh, ">>", $filename or die "$!:$filename"; print $fh '追加データ', "\n"; close $fh;
# 文字コードを指定した読み込み use strict; use warnings; my $filename = 'data.txt'; open my $fh, "<:utf8", $filename or die "$!:$filename"; my @lines = <$fh>; close $fh;
# コマンドを実行する use strict; use warnings; my $cmd = 'netstat'; open my $fh, '-|', $cmd or die $!; while (my $line = <$fh>) { print $line; } close $fh or die $! ? "Error:$!" : "Status:$?";以前は3引数のopen(open FILEHANDLE, MODE, EXPR)が使えなくて2引数のopen(open FILEHANDLE, EXPR)を使っていましたが書き方によってはファイル名を外部から受け取るような場合に不正なコマンドを実行させる攻撃を受ける脆弱性につながるため現在では通常利用しません。
# 3引数のopen(通常の書き方) open my $fh, ">>", $filename or die "$!:$filename"; # 2引数のopen(この書き方はしない) open my $fh, ">> $filename" or die "$!:$filename";以前はFILEHANDLEにFHのようなベアワードのファイルハンドルを指定する方法も使われていましたが、ファイルのオープン中に同名のファイルハンドルを使ってしまうと意図していない動作をしてしまうため、myを使った方法を通常は利用します。
# myを使った方法(通常の書き方) open my $fh, ">", $filename or die "$!:$filename"; # ベアワード使った方法(この書き方はしない) open FH, ">", $filename or die "$!:$filename";
関連項目
・ファイルを一文字列として読み込む・binmode関数
・close関数
・eof関数
・flock関数
・getc関数
・print関数
・printf関数
・read関数
・sysopen関数