アプリ版:「スタンプのみでお礼する」機能のリリースについて

"a.csv"と"b.csv"を比較して、一致しない場合は"a.csv"を"b.csv"に置き換えたいと思っています。
しかし、"a.csv"と"b.csv"の先頭9行は必ず一致しないデータが入っているので、
1行目~9行目まではチェックせずに、以降の行からチェックするようにしたいです。

このようにプログラムするにはどのようにしたらいいのでしょうか。
お手数をおかけしますが、ご教授いただけると幸いです。
また、見本のソース等をいただけると嬉しいです。

A 回答 (1件)

配列の比較方法にもっと良い書き方がありそうですが、例えばこんな感じでしょうか。



use strict;
use File::Copy 'move';

sub readfile {
my ($filename, $lines_to_cut) = @_;
open(my $fh, "<", $filename) or die "cannot open < $filename: $!";
my @lines = <$fh>;
close($fh);

return @lines[$lines_to_cut .. $#lines];
}

sub is_same_array {
my ($r0, $r1) = @_;
my @a0 = @$r0;
my @a1 = @$r1;

if ($#a0 != $#a1) {
return 0;
}
for (my $i = 0; $i < $#a0; $i++) {
if ($a0[$i] ne $a1[$i]) {
return 0;
}
}
return 1;
}

my $LINES_TO_CUT = 9;
my $FILE_A = 'a.csv';
my $FILE_B = 'b.csv';

my @a_csv = readfile('a.csv', $LINES_TO_CUT);
my @b_csv = readfile('b.csv', $LINES_TO_CUT);

if (is_same_array(\@a_csv, \@b_csv)) {
print "$FILE_A and $FILE_B are same.\n";
} else {
print "$FILE_A and $FILE_B are different.\n";
print "Moving $FILE_A to $FILE_B.\n";
move($FILE_A, $FILE_B);
}

readfileで各行が配列の要素となった配列を、$lines_to_cut行分だけ省いた形で返してもらえるので、is_same_arrayにて単純にその比較をして同じか違うかを判定しています。

CSVとして同じかどうかなんて判断していないので、CSVとしては同じものでも違う書き方をしていたら違うと判断します。例えば、"abc"とabcは同じと本来は解釈すべきですが、こいつは単純な配列の要素の比較しかしないので違うと判断します。
    • good
    • 0
この回答へのお礼

素早い回答、ありがとうございます!
思い通りに動きました!

お礼日時:2012/11/10 18:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!