Сравнение двух файлов с использованием Perl MD5 - PullRequest
3 голосов
/ 28 февраля 2012

Я хотел запустить код, который постоянно проверяет, существует ли файл, если он существует, затем проверяет MD5 файлов по сравнению с предыдущим MD5. Если есть некоторые изменения, то он выполняет некоторый код. Но Perl MD%, похоже, меняется каждый раз, когда я вызываю hexdigest для того же файла. MD5 меняется каждый раз?

у меня изначально было

$md5 = Digest::MD5->new; 

до while(1)

Если это не так, как это нужно сделать, есть ли что-нибудь еще для достижения моих намерений? Спасибо

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;
            }
    }
}

Ответы [ 2 ]

8 голосов
/ 29 февраля 2012

Операция hexdigest: однократное чтение , что означает, что после ее выполнения значение сбрасывается. Его можно прочитать только один раз, но вы пытаетесь прочитать его дважды. Храните его во временном хранилище при первом прочтении.

Из документации (мой акцент):

$ md5-> переваривать

Возвращает двоичный дайджест для сообщения. Возвращенная строка будет иметь длину 16 байт.

Обратите внимание, что операция дайджеста является деструктивной операцией однократного чтения . Как только это было выполнено, Дайджест :: MD5 объект автоматически сбрасывается и может быть использован для расчета другого значение дайджеста. Вызовите $ md5-> clone-> digest, если вы хотите вычислить дайджест без сброса состояния дайджеста.

$ md5-> hexdigest

То же, что $ md5-> digest , но вернет дайджест в шестнадцатеричной форме. Длина возвращаемой строки будет 32, и это будет только содержит символы из этого набора: '0' .. '9' и 'a' .. 'f'.

1 голос
/ 29 февраля 2012

Я не вижу проблемы с этим.Вот более короткая версия того, что вы пытаетесь сделать:

#!/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, поэтому я изменил оператор использования из вашего примера.

...