Perlの小部屋
Perlのプログラミングや利用方法を基本的を中心に情報提供しています

入出力

一般的にプログラムではファイルからデータを読み込み、 処理をした結果をファイルに出力します。Perlでは、ファイルの入出力にファイルハンドルを使います。ファイルの読み込みや書き込みをするには、まずファイルを開いてファイルハンドルに関連付けし、そのファイルハンドルを操作するのが基本手順になります。

ファイルオープン

ファイルオープンとクローズ- open, close -

# ファイルを読み込みモードでオープンする場合 (open命令)
open (ファイルハンドル, 'ファイル名');

# ファイルを読み込む処理 (read命令)
配列 = <ファイルハンドル>

# ファイルのオープンを閉じる処理 (close命令)
close ファイルハンドル

# 記録ファイルを、INというファイルハンドルで読み込む。
open(IN,"data.txt") or die "$!"; 
@data = <IN>;         # 読み込んだ記録ファイルを配列@dataにセット
close(IN);        # 読み込み処理を閉じる
# foreach文で一気に読み込む
foreach (@data) {
    print;
}

# while文で1行づつ読み込む
open(IN,"data.txt");
while(<IN>) {
    print;
}
close(IN);

オープンモード

オープンモード意味
<読み込みモード(省略可)
>書き込みモード
ファイルが存在したら上書き、存在しなければ新規作成
>>追加書き込みモード
+<
+>
+>>
読み書き両用モード
A < BAはBより小さい
A <= BAはBより小さいか等しい
# ファイルの読み込みモード
open(FH,"< data.txt");
print <FH>;
close(FH);

# ファイルの上書きモード
open(FH,"> data.txt");
print FH "NEWDATA";
close(FH);
# data.txtに「NEWDATA」という文字列を上書きします
#上書きなので元のデータを消込、新たなデータを書き込むことになります

# ファイルの追加上書きモード
open(FH,">> data.txt");
print FH "NEWDATA";
close(FH);
# data.txtに「NEWDATA」という文字列を追加で書き込みます
# 追加なので元のに、新たなデータを追加します
# data.txtに「DATA」という文字列があった場合、
# 実行後の中身は「DATANEWDATA」となります

例外処理

ファイルオープンが失敗した場合にOSから通知されたメッセージの内容($!に)

# メッセージのログをとる
my $file = 'data.txt';
open(FH,"< $file") or die qq/Can't open file "$file" : $!/;
print <FH>;
close(FH);

ファイルの削除と変更

内容構文
ファイルの削除unlink ファイル名
ファイル名の変更rename 変更前のファイル名, 変更後のファイル名
パーミッションの変更chmod モード, ファイル1, ファイル2, ...
#■ unlink関数
# file.txtを削除する
unlink("file.txt");

#■ rename関数
# file.txtをfile.csvにリネームする
rename("file.txt", "file.csv");

#■ chmod関数
# file.txtのパーミッションを666に変更する
chmod(0666, "file.txt");

ファイルのコピーと移動

File::Copyモジュールを利用すると簡単です

# ファイルのコピー
use File::Copy;
my $from = 'old.csv';
my $to = 'new.csv';
copy($from, $to);

# ファイルの移動 (ファイル名を変更する)
move($from, $to)

ファイルロック

複数のプロセスがひとつのファイルに対して並行して書き込み行う場合は、それぞれのプロセスが順番を守る必要があります。ファイルロック機構を使用すれば、複数のプロセスが順番を守ってファイルに安全にアクセスすることができます。

排他ロックと共有ロック

種類使用機会他のプロセスがロックを掛けようとした場合
共有ロック読み込む場合共有ロックは許可するが排他ロックを許可しない
排他ロック書き込む場合共有ロックも排他ロックも許可しない

flock関数 - ファイルの排他制御

flock関数を使用すれば、ファイルの排他処理を行うことができます。

flock (ファイルハンドル, 操作モード);

操作モード機能説明
1共有ロックロック中は読み込みのみ可
2排他ロックロック中は読み書き禁止い
4非ブロックロック中は待たずにあきらめるい
8ロック解除ロックを解除する
# ファイルの排他制御
# ファイルの上書きモード
open(FH,"> data.txt");
flock(FH,2);      #排他ロック
print FH "NEWDATA";
#flock(FH,8);     #ロック解除 
#close(FILE)で自動で解除の方がファイルの破損の可能性が低くなります
close(FH);
ページトップ