でばぐめ -IT技術メモ-

でばぐめ -IT技術メモ-

主にハードウェア/ソフトウェアのプログラミングに関するブログです。

Amebaでブログを始めよう!

perlfaq5に「あるファイルの行数を数えるには? 」という問いに対し、

下の記述が載っています。


$lines = 0;
open(FILE, $filename) or die "Can't open $filename: $!";
while (sysread FILE, $buffer, 4096) {
  $lines += ($buffer =~ tr/\n//);
}

ファイルを読み込んで、改行の数を数えることで行数を取得しています。



配列の要素数を利用すると下のように書けます。


open(FILE, $filename) or die "Can't open $filename: $!";
@buffers  = <FILE>; 
$lines = @buffers;

こちらの方がシンプルな気はします。


perlfaq5での記述は、無駄にメモリを使わないのが利点 ということですかね?


Perlで2つのファイル比較を行う場合、File::Compareモジュールを使用すると簡単です。


use File::Compare;

if(compare("file1","file2") == 0) {
  print "equal\n";
}

compareの戻り値は比較したfile内容が同じなら"1"、違う場合は"0"、

ファイルがない等errorの場合は"-1"になります。



File::Compareはcompare_text関数があります。DESCRIPTIONをみてもよくわかりません...が、
何となく、各行に処理を加えて比較したい場合に有効そうです。


例えば、大文字/小文字を区別したくない場合

compare_text("file1","file2", sub {lc($_[0]) ne lc($_[1])});


Perlでファイルのコピーを行う場合、File::Copyモジュールを使用すると簡単です。


■ファイルのコピー
"file1"を"file2"というファイル名でコピーする場合


use File::Copy;

copy("file1", "file2") or die "Copy failed: $!";

コピー先をディレクトリにすると指定したディレクトリに同じファイル名でコピーされます。



■ファイルの移動
move関数でファイルの移動もできます。

"file1"を"file2"というファイル名に変更場合

use File::Copy;

move("file1", "file2") or die "Move failed: $!";