あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

perlでファイルサイズの比較をする

use strict;
use DirHandle;

my @dir_list = ( 
    "T:\\remote\\classes", 
    "c:\\local\\classes", );

my %namelist = &get_class_list(@dir_list);

foreach my $name (sort keys(%namelist))
{ 
    if((stat "$dir_list[0]/$name")[7] !=
	(stat "$dir_list[1]/$name")[7]){
	print "$name\t" . 
	(stat "$dir_list[0]/$name")[7] . 
	"," . (stat "$dir_list[1]/$name")[7] . "\n";
    }
}

sub get_class_list{
    my %class_list;
    while (@_){
	my $dir = new DirHandle pop @_;
	while(my $name = $dir->read)
	{
	    $_ = $name;
	    if(/\.class$/){
		$class_list{$name} = undef;
	    }
	}
	$dir->close;
    }
    return %class_list;
}

 とりあえず、こんな感じになった。
 get_class_listで、双方のディレクトリからファイルのリストをまず取得しておいて、そのリストを使って、双方のディレクトリに対してサイズを取得し、違っていたらファイル名とリモートサイズ、ローカルサイズを出力するだけ。
 ifの条件の中で使ったサイズ取得の箇所が、printのところでも使われているのが冗長だな。
 subの引数が配列のみ想定っていうのも、勝手が違う感じだ。
 まあ、最初の内は色々やってみるのも重要なので、その辺はあまり気にせず慣れるのを第一で行くことにする。が、遠くないうちにできるだけ参考になるサンプルがたくさん入った本を買って、セオリー等を覚えることにしよう。変な型がつくと後で矯正するのが大変だからな。