2012-02-28 18 views
3

ファイルが存在する場合にファイルが存在するかどうかをチェックし、以前のMD5​​に対してファイルのMD5をチェックするコードを実行したかったのです。いくつかの変更がある場合、いくつかのコードを実行します。 しかし、私が同じファイルのhexdigestを呼び出すたびにperl MD%が変化しているようです。MD5は毎回変わるのですか?これは、それが行われることになっている方法ではない場合、私はintially while(1)perl md5を使用して2つのファイルを比較する

$md5 = Digest::MD5->new; 

を持っていた

は私の意図を達成するために何か他のものはありますか? おかげ

while(1) 
{ 
    if(!(-e $config_file)){ 
      next; 
    }else{ 
      $md5 = Digest::MD5->new; 
      $md5->addpath($config_file); 
      print "<->"; 
      print $md5->hexdigest; 

      $value=($digest eq $md5->hexdigest ? 1 : 0); 
      if($value==1) 
      { 
        next; 
      }else 
      { 
        $digest=$md5->hexdigest; 
      } 
    } 
} 
+1

"use strict"を使用していた場合、この問題は発生しません。してください、 '厳格な使用! – Ouki

答えて

8

hexdigest操作である読みワンス、あなたはそれを実行した後、値がリセットされることを意味しています。これは一度だけ読み取ることができますが、二度読むことを試みます。初めて読むときは一時的に保管してください。 documentationから

(私の強調):

$ md5->バイナリは、メッセージダイジェスト

リターンを消化。返される文字列は16バイトです。

ダイジェスト操作は、実質的には、破壊的な一度の読み取り操作です。実行されると、Digest :: MD5 オブジェクトが自動的にリセットされ、別の ダイジェスト値を計算するために使用できます。ダイジェスト状態をリセットせずに ダイジェストを計算する場合は、$ md5-> clone-> digestを呼び出します。

$ md5-> hexdigest

$ md5-同じ>ダイジェストが、ダイジェストを16進形式で返します。返される文字列の長さは32で、 にはこのセットの文字が含まれます: '0' .. '9'と 'a' .. 'f'。

+0

ありがとう!!それはうまくいった!しかし、これまでにファイルに変更があったとき(私はそのファイルに新しいファイルをコピーしてファイルを変更した)、変更が2回検出され、else部分が2回実行されました。小さなハッキングを行いましたそれは働く。 – Dexters

1

これは問題が発生していません。ここではあなたが何をしようとしての短いバージョンです:

#!/usr/bin/env perl 

use strict; 

use Digest::MD5::File; 
my $config_file = '/tmp/test.txt'; 
my $digest; 

while (1) { 
    next if !-e $config_file; 

    my $md5 = Digest::MD5::File->new; 
    $md5->addpath($config_file); 

    print $md5->hexdigest . "\n"; 

    print '-' x20 . " digest changed"; 
    $digest = $md5->hexdigest; 
} 

あなたがコードを実行する場合は、ダイジェストが$ダイジェストが初めてに割り当てられている場合にのみ最初の時間を、変更することがわかります。その後、ダイジェストは変更されません。

addpathは、Digest :: MD5 :: FileではなくDigest :: MD5 :: Fileで提供されているようですので、使用例をあなたの例から変更しました。

関連する問題