2009/08/02
Perlで書く 2009.08.02 Vol.239
===================================================================== Perlで書く 2009.08.02 Vol.239 [REF]open http://www2u.biglobe.ne.jp/~MAS/perl/ ===================================================================== ●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"; --------------------------------------------------------------------- ●関連項目 ・ファイルを一文字列として読み込む http://www2u.biglobe.ne.jp/~MAS/perl/waza/fonestr.html ・binmode関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/binmode.html ・eof関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/eof.html ・getc関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/getc.html ・print関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/print.html ・printf関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/printf.html ・read関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/read.html ・sysopen関数 http://www2u.biglobe.ne.jp/~MAS/perl/ref/sysopen.html ===================================================================== ■雑記 以前から書こう書こうと思いながらも関連項目が多くてちょっと面倒 だからと後回しにしていたopen関数について書きました。思った通り 関連項目の修正が面倒でした。 関連項目が多いというのはそれだけよく使う関数でもあるということ ですから、書き終わってみれば書いて良かったと思っています。 ===================================================================== Perlで書く(マガジンID:0000109251) 配信数:837 発行者:MAS 本メールマガジンに関するご意見・お問い合わせは t-masuda@mvd.biglobe.ne.jp までお寄せ下さい。 解除 http://www2u.biglobe.ne.jp/~MAS/perl/magazine.html 検索 http://www2u.biglobe.ne.jp/~MAS/perl/search/index.html バックナンバー http://archive.mag2.com/0000109251/index.html RSS http://archive.mag2.com/0000109251/rss10.xml 本メールマガジンは「まぐまぐ」 http://www.mag2.com/ を利用して発行 しています。 =====================================================================


