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。
覚書
- ファイル名のかわりに、オープン済のファイルハンドルを渡してもOK。 その場合、ファイルのopen/closeやファイルロックは自分で面倒を見ること。
Tie::File
の配列の要素をundefすると、その行は空行になる。 ファイル行数は変わらない。- オプション
autochomp
にfalse
を指定しない限りは、ファイル中の改行は意識する必要なし。 自動的に取り除いたり付け加えたりしてくれる。 -- こんなかんじ...tie my @array, 'Tie::File', 'filename', autochomp => 0;
- 全行をキャッシュに読むわけではないので、巨大なファイルを扱っても平気なのは魅力。
- ただし、各行のオフセットとキャッシュのために、最初にメモリを使う。 小さいファイルでは逆に効率が悪いかも。
[ ページ先頭へ ]
もっと細かいところ
オブジェクト指向がよければ、こんな感じ。
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;
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
[ ページ先頭へ ]