ファイル操作
【環境条件】
Eclipse 4.4(ルナ)
XAMPP 1.8.3
Perlは既にインストール済み
【ファイル操作】
■基本
1)ファイルハンドル
・ファイルハンドル→コネクションを区別するためにコネクションに対して付ける名前を指す
・コネクション→ファイルとPerlのプログラムの間でやり取りを行うための通信経路(コネクション)の事。
Perlプログラムではコネクションを使わないとファイル操作が出来ない。
2)ファイルハンドル名の付け方
変数名にはアルファベット・数字・アンダーバー("_")を使うことが出来ます
(例) name, old20, _hokan
先頭の文字に数字は利用できません
(例) 10kago は不可
大文字と小文字は区別します。
(例) old と Old は別の変数名となります
3)標準で用意されているファイルハンドル
STDIN 標準入力。キーボードからの入力など。
STDOUT 標準出力。画面への出力など。
STDERR 標準エラー。エラーとしての出力。
■ファイルのオープンとクローズ
書式
オープン
open(ファイルハンドル名, "ファイル名");
open(ファイルハンドル名, "モード", "ファイル名");
クローズ
close(ファイルハンドル名);
サンプル「file01.pl」
use strict;
use warnings;
if (open(DATAFILE, "data.txt")){
print "data.txtを開く事に成功しました\n";#ファイルハンドル名はDATAFILE
if (close(DATAFILE)){
print "data.txtを閉じる事に成功しました\n";
}else{
print "data.txtを閉じる事に失敗しました\n";
}
}else{
print "data.txtを開く事に失敗しました\n";
}
if (open(DATAFILE, "data1.txt")){
print "data1.txtを開く事に成功しました\n";
if (close(DATAFILE)){
print "data1.txtを閉じる事に成功しました\n";
}else{
print "data1.txtを閉じる事に失敗しました\n";
}
}else{
print "data1.txtを開く事に失敗しました\n";
}
結果
■ファイルオープン時のエラー処理
「open」関数を使ってファイルを開こうとして失敗した場合、プログラムの実行を中断するには「die」関数を使ってプログラムを終了させる方法がよく使われる。
サンプル「file02.pl」
use strict;
use warnings;
open(DATAFILE, "data.txt") or die("error :$!");
print "data.txtを開く事に成功しました\n";
close(DATAFILE);
open(DATAFILE, "data1.txt") or die("error :$!");
print "data1.txtを開く事に成功しました\n";
close(DATAFILE);
・結果
data.txtを開く事に成功しました
error :No such file or directory at C:/xampp/htdocs/perl_kurikaesi/file.pl line 35.
■テキストデータを読み込む
サンプル「file03.pl」
use strict;
use warnings;
open(DATAFILE, "< data4-1.txt") or die("Error:$!");
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
テキストファイル「data4-1.txt」
東京
Tokyo
・結果
東京
Tokyo
■テキストデータを書き込む
サンプル「file04.pl」
use strict;
use warnings;
open(DATAFILE, ">> data5-1.txt") or die("Error:$!");
print DATAFILE "大阪\n";
print DATAFILE "Osaka\n";
下記のように「data5-1.txt」に記入される
【モードの指定】
1)「<」モード(読み込み)
書式
open(ファイルハンドル, "< ファイル名");
open(ファイルハンドル, "<", "ファイル名");
・サンプル「file05.pl」
use strict;
use warnings;
open(DATAFILE, "<", "data.txt") or die("Error:$!");
while(my $line = <DATAFILE>){
chomp($line);
print "$line¥n";
}
close(DATAFILE);
・テキストサンプル「data.txt」
これはテストです
・実行
「これはテストです」
2)「>」モード(書き込み)
書式
open(ファイルハンドル, "> ファイル名");
open(ファイルハンドル, ">", "ファイル名");
・サンプル「file05.pl」
use strict;
use warnings;
open(DATAFILE, ">", "data1.txt") or die("Error:$!");
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";
close(DATAFILE);
open(DATAFILE, ">", "data1-1.txt") or die("Error:$!");
print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";
close(DATAFILE);
・実行
data1.txtにデータが書き込まれる
加藤 花子
東京都新宿区
女性
また
無いdata1-1.txtにはデータが書き込まれない
3)「>>」モード(書き込み)
open(ファイルハンドル, ">> ファイル名");
open(ファイルハンドル, ">>", "ファイル名");
「>>」モードの場合
・書き込み専用
・ファイルが存在していた場合、ファイルを開いた時にファイルの内容を変更しない
・ファイルが存在してなかった場合、新規にファイルを作成
・サンプル「file06.pl」
use strict;
use warnings;
open(DATAFILE, ">>", "data.txt") or die("Error:$!");
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";
close(DATAFILE);
open(DATAFILE, ">>", "data1-1.txt") or die("Error:$!");
print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";
close(DATAFILE);
・実行
data.txt→データが追加される
これはテストです加藤 花子
東京都新宿区
女性
data1-1.txt→新規作成されデータが書き込まれる
山崎 一郎
大阪府吹田市
男性
4)「+<」モード(読み書き)
書式
open(ファイルハンドル, "+< ファイル名");
open(ファイルハンドル, "+<", "ファイル名");
・サンプル「file06.pl」
use strict;
use warnings;
open(DATAFILE, "+<", "data9-1.txt") or die("Error:$!");
print DATAFILE "加藤 花子";
close(DATAFILE);
open(DATAFILE, "+<", "data9-1.txt") or die("Error:$!");
print "変更後:\n";
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
close(DATAFILE);
open(DATAFILE, "+<", "data9-2.txt") or die("Error:$!");→存在しないのでエラー
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";
close(DATAFILE);
・実行
変更後:
加藤 花子
東京都杉並木区
男性
Error:No such file or directory at
5)「+>」モード(読み書き)
書式
open(ファイルハンドル, "+> ファイル名");
open(ファイルハンドル, "+>", "ファイル名");
・読み込み、書き込みの両方とも可
・ファイルが存在していた場合、ファイルを開いた時にファイルサイズを0にする
・ファイルが存在してなかった場合、新規にファイルを作成
・サンプル「file07.pl」
use strict;
use warnings;
open(DATAFILE, "+>", "data9-1.txt") or die("Error:$!");
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";
close(DATAFILE);
open(DATAFILE, "<", "data9-1.txt") or die("Error:$!");
print "追加後:\n";
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
close(DATAFILE);
open(DATAFILE, "+>", "C:/Perl/data9-2.txt") or die("Error:$!");
print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";
close(DATAFILE);
実行
data9-1.txtに書き込めれた後読み込まれる
追加後:
加藤 花子
東京都新宿区
女性
C:/Perl/data9-2.txtには
山崎 一郎
大阪府吹田市
男性
が書き込めれる
6)「+>>」モード(読み書き)
書式
open(ファイルハンドル, "+>> ファイル名");
open(ファイルハンドル, "+>>", "ファイル名");
・読み込み、書き込みの両方とも可
・ファイルが存在していた場合、ファイルを開いた時にファイルの内容を変更しない
・ファイルが存在してなかった場合、新規にファイルを作成
・ファイルポインタは最後
・サンプル「file08.pl」
use strict;
use warnings;
open(DATAFILE, "+>>", "data11-1.txt") or die("Error:$!");
print "追加前:\n";
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
print DATAFILE "加藤 花子\n";
print DATAFILE "東京都新宿区\n";
print DATAFILE "女性";
close(DATAFILE);
open(DATAFILE, "+>>", "data11-1.txt") or die("Error:$!");
print "追加後:\n";
while(my $line = <DATAFILE>){
chomp($line);
print "$line\n";
}
close(DATAFILE);
open(DATAFILE, "+>>", "C:/Perl/data11-2.txt") or die("Error:$!");
print DATAFILE "山崎 一郎\n";
print DATAFILE "大阪府吹田市\n";
print DATAFILE "男性";
close(DATAFILE);
・実行
追加前:
追加後:
data11-1.txt
山田太郎
東京都杉並区
男性
加藤 花子→追加される
東京都新宿区
女性
C:/Perl/data11-2.txt
山崎 一郎
大阪府吹田市
男性