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

perlのDigest::MD5;でのMD5算出が異なる

下記、スクリプトをレンタルサーバ上と、WindowsOS上で走らせてみたところ、おなじファイルにも関わらず、MD5が異なります。
何故でしょうか?

#!/usr/local/bin/perl
use strict;
use warnings;

use Digest::MD5;

my $file = 'test.zip';
my $ctx = Digest::MD5->new;
open my $fh, "<$file";
$ctx->addfile($fh);
my $md5 = $ctx->hexdigest;
close($fh);

open my $fh2, ">>md5.txt";
print $fh2 "$file $md5\n";
print "$file $md5\n";
close $fh2;

A 回答 (2件)

test.zipファイルを読み込む時にOSに応じた改行コード変換が行われていると思います。



それを抑制するために
open my $fh, "<$file";
の後で
binmode $fh;
を行ってみてください。

バイナリファイルを操作する時はbinmodeが必要になります。

この回答への補足

まさに、おっしゃるとおりでした!
的確なアドバイスありがとうございます。
バージョンやファイル破損などほとんど関係ないところで
色々悩んでいたものが解決いたしました。

ここで、不思議に思うのですが、レンタルサーバ上でも、
通常のファイル読み込みやCGIは改行ありで解釈していると思うのですが、
何故、bindmodeを使わなくても、正常に算出できたのでしょうかね?

もし分かりましたらこちらも教えいただけると幸いです。

補足日時:2010/10/02 18:39
    • good
    • 0

binmodeの働きは、



Linux/Unixのとき =>あってもなくても動作は同じ
Windowsのとき =>binmodeだとそのまま入出力で、binmodeないと読み込み時CRを読み飛ばし、書き込み時LFをCR+LFに変換

です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
とても参考になりました!

お礼日時:2010/10/02 21:09

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