HOME備忘帳

Tie::Fileモジュールの使い方メモ

テキストファイルの各行に、perlの配列でアクセスできるモジュールなのです。変更は随時ファイルに反映されるので、用途によっては便利、用途によっては不便。

個人的には、頻繁に使ってます。:-) ちょっとテキストファイルをどうにかしたいだけ、って時とか、使い捨てプログラムには、とりあえず早く書けていいです。ログファイルを部分的に取リ出して、処理してブラウザで見るとか(この用途に限ると`tail -n 20 ファイル名`;とかで済ますこともあるのですが)。

use Tie::File;

tie my @array, 'Tie::File', "filename" or die;

# 配列は0から始まるので、[0]が1行目。
$array[13] = 'blah';  # ファイルの14行目を'blah'に変更
print $array[42];     # ファイルの43行目をprint

$n_recs = @array:     # このファイルの行数を取得
$#array -= 2;         # ファイルの最後の2行を削除

for (@array) {
    s/PERL/Perl/g;      # ファイル中の「PERL」を「Perl」に置換
}

untie @array; # これでファイルclose。

覚書

[ ページ先頭へ ]

もっと細かいところ

オブジェクト指向がよければ、こんな感じ。

my $obj = tie(my @array, 'Tie::File', $filename) or die;
$obj->flock;

my $datline = $obj->FETCH(20); # 21行目取得
$obj->STORE(16, $dataline);    # 18行目に書き込み

オプションは4つ目以降の引数で指定。

use Tie::File;
use Fcntl 'O_RDONRY';

# 読み込み専用!
tie(my @array, 'Tie::File', $filename, mode=>O_RDONRY) or die;
Tie::Fileのオプション(抜粋)
autochomp 行末の改行を自動的に外したりつけたりするかどうか。
trueまたはfalseを指定する。デフォルトはtrue(自動で操作する)
mode 読み書きのモード。Fcntlモジュールをuseして、O_RDONRYとか、O_RDWR|O_CREATEとかする。
discipline ファイルをオープンするとき、ファイルハンドルに追加してくれる値。公式ドキュメントには非掲載。後述参照。

disciplineについて

試してみた感想。

use utf8;でコード内に全角日本語をモリモリ書いている時、discipline => ':encoding(utf8)'オプションの存在に小躍りしたのですが。現状、書き込みには難がある模様。参考にしたサイトでも、修正は難しいんじゃない?みたいなコメントでしたし、読み込み時のみに使用中です。

あらかじめencodingつきでオープンしておいたファイルハンドルを渡せばいいのかと言うと、どうも上手くいかないので、水際でencode/decodeが結局確実なのかもしれないです。

[ ページ先頭へ ]

参考

CPANのTie::Fileのページ:http://search.cpan.org/~toddr/Tie-File-0.98/lib/Tie/File.pm

using perl tie::file with utf encoded file (stack overflow):http://stackoverflow.com/questions/7773501/using-perl-tiefile-with-utf-encoded-file

最終更新日:2012/10/23

[ ページ先頭へ ]