Question

Je voulais exécuter un code qui continue de vérifier si un fichier sort s'il existe, puis vérifie le MD5 des fichiers par rapport au MD5 précédent. S'il y a des modifications, il exécute du code. Mais le Perl MD% semble changer chaque fois que j'appelle le hexdigest pour le même fichier. MD5 change-t-il à chaque fois?

J'avais initialement

$md5 = Digest::MD5->new; 

avant de while(1)

Si ce n'est pas ainsi que cela doit être fait, y a-t-il autre chose pour réaliser mes intentions? Merci

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;
            }
    }
}
Était-ce utile?

La solution

L'opération hexdige lecture, ce qui signifie qu'après l'avoir exécuté, la valeur est réinitialisée. Il ne peut être lu qu'une seule fois, mais vous essayez de le lire deux fois. Conservez-le dans un temporaire lorsque vous le lisez la première fois.

Du Documentation (mon accent):

$ md5-> digest

Renvoyez le digest binaire pour le message. La chaîne retournée sera de 16 octets de long.

Notez que l'opération de digest est effectivement un opération destructrice et en lecture. Une fois qu'il a été effectué, l'objet Digest :: MD5 est automatiquement réinitialisé et peut être utilisé pour calculer une autre valeur de digestion. Appelez $ md5-> clone-> digest si vous souhaitez calculer le digest sans réinitialiser l'état de digestion.

$ md5-> hexdigest

Identique à $ md5-> digest, mais retournera le digest sous forme hexadécimale. La longueur de la chaîne retournée sera 32 et ne contiendra que des caractères de cet ensemble: '0' .. '9' et 'a' .. 'f'.

Autres conseils

Je ne vois pas de problème avec ça. Voici une version plus courte de ce que vous essayez de faire:

#!/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; 
}

Si vous exécutez le code, vous ne verrez que le digest ne modifie que la première fois, lorsque le $ digest est attribué à la première fois. Après cela, le digest ne change pas.

AddPath semble être fourni par Digest :: MD5 :: Fichier plutôt que par Digest :: MD5 lui-même, j'ai donc modifié l'instruction d'utilisation de votre exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top