「+>」モード(読み書き)
次は「+>」モード(読み書き)です。このモードの場合は読み込みと書き込みの両方が利用できる状態でファイルを開きます。書式は次のどちらかを使用します。
open(ファイルハンドル, "+> ファイル名"); open(ファイルハンドル, "+>", "ファイル名");
引数を2つ使う場合にはファイル名の前に「+> 」を付けます。引数を3つ使う場合には2番目の引数に「+>」指定し、3番目の引数にファイル名を指定します。
「+>」モードの場合は次の通りです。
・読み込み、書き込みの両方とも可 ・ファイルが存在していた場合、ファイルを開いた時にファイルサイズを0にする ・ファイルが存在してなかった場合、新規にファイルを作成
指定したファイルが存在していた場合はいったんファイルサイズを0にしてから書き込みを行いますので、上書きでの書き込みということになります。また指定したファイルが存在していなかった場合でもエラーとならず、新規にファイルが作成されます。
実際には次のように記述します。
open(DATAFILE, "+>", "data.txt") or die("error :$!");
この場合、「data.txt」と言うファイルを読み書き両用で開きます。
サンプルプログラム
では簡単なプログラムで確認して見ます。
use strict; use warnings; use utf8; use open ":utf8"; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; open(DATAFILE, "+>", "data10-1.txt") or die("Error:$!"); print DATAFILE "加藤 花子¥n"; print DATAFILE "東京都新宿区¥n"; print DATAFILE "女性"; close(DATAFILE); open(DATAFILE, "<", "data10-1.txt") or die("Error:$!"); print "追加後:¥n"; while(my $line = <DATAFILE>){ chomp($line); print "$line¥n"; } close(DATAFILE); open(DATAFILE, "+>", "data10-2.txt") or die("Error:$!"); print DATAFILE "山崎 一郎¥n"; print DATAFILE "大阪府吹田市¥n"; print DATAFILE "男性"; close(DATAFILE);
上記を「test10-1.pl」の名前で保存します。保存する時の文字コードは「UTF-8」として下さい。
今回はカレントディレクトリに「data10-1.txt」と言うファイルを用意します。ファイル内には次のように記述を行います。ファイルの文字コードはUTF-8(BOM無し)に設定してあります。
コマンドプロンプトを起動し、プログラムを保存したディレクトリに移動してから次のように実行して下さい。
まず存在していた「data10-1.txt」ファイルを開き書き込みを行っています。ファイルが存在し、既に何かデータが含まれていた場合であっても、いったんファイルの中身をクリアし先頭から書き込みを行います。変更後の内容を確認するために、今度は「<」モードで「data10-1.txt」ファイルを開き含まれているデータを読み出して表示しています。
次に存在していなかった「data10-2.txt」ファイルを指定してファイルを開いています。「+>」モードの場合はファイルが存在しなかった場合には新規に作成しますので、「data10-2.txt」ファイルが作成され書き込みが行われます。結果的に「data10-2.txt」ファイルは次のようになります。
( Written by Tatsuo Ikura )