2012-02-28 2 views
3

파일이 존재하면 종료되는지 확인한 다음 이전 MD5와 비교하여 파일의 MD5를 확인하는 코드를 실행하려고합니다. 몇 가지 변경 사항이 있으면 일부 코드가 실행됩니다. 그러나 동일한 파일에 대해 hexdigest를 호출 할 때마다 Perl MD %가 변경되는 것처럼 보입니다. MD5가 매번 변경됩니까? 이 그것을 할 내 의도를 달성하기 위해 무엇이되는 방법이 아닌 경우perl md5를 사용하여 두 파일 비교

나는 intially while(1)

전에

$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

"엄격한 사용"을 사용했다면이 문제가 발생하지 않습니다. 제발, '엄격한 사용'! – Ouki

답변

8

hexdigest 작업이 읽기 번, 당신이 그것을 실행 한 후, 값이 재설정 것을 의미한다. 그것은 한 번만 읽을 수 있지만 두 번 읽으려고합니다. 처음 읽을 때 임시로 보관하십시오. documentation (내 강조)에서

:

$ md5-이>

돌아 바이너리가 메시지의 다이제스트. 반환 된 문자열은 16 바이트 길이입니다. 다이제스트 동작 효율적임을

주의점 파괴적 판독 동작 후에. 수행이 완료되면 Digest :: MD5 개체가 자동으로 다시 설정되고 다른 다이제스트 값을 계산하는 데 사용할 수 있습니다. 다이제스트 상태를 재설정하지 않고 다이제스트를 계산하려면 $ md5-> clone-> digest를 호출하십시오.

$ md5-> hexdigest

같은 $ md5->로을 소화하지만, 16 진수 형식으로 다이제스트를 반환합니다. 반환되는 문자열의 길이는 32이고이 세트의 문자는 에만 포함됩니다 ('0'.. '9'및 'a'.. 'f').

+0

감사합니다 !! 그게 효과가 있었어! 하지만 여전히 파일에 변경이 있었을 때 (나는 그 이름으로 새 파일을 복사하여 파일을 변경했을 때) 변경 사항은 두 번 감지되었고 else 부분은 두 번 실행되었습니다. 그래서 작은 해킹을 만들었습니다 (두 번째 변경을 실행할 때마다). 그것은 작동합니다. – 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 자체에서 제공하는 것으로 보이므로 사용 예제를 사용자 예제에서 변경했습니다.