3

我想运行一个代码,持续检查文件是否存在,然后检查文件的 MD5 与以前的 MD5 。如果有一些变化,那么它会执行一些代码。但是每次我为同一个文件调用 hexdigest 时,perl MD% 似乎都会发生变化。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;
            }
    }
}
4

2 回答 2

8

hexdigest 操作是read-once,这意味着在您执行它之后,该值将被重置。它只能读取一次,但您尝试读取两次。第一次阅读时将其临时存储。

文档(我的重点):

$md5->摘要

返回消息的二进制摘要。返回的字符串长度为 16 个字节。

请注意,摘要操作实际上是一种破坏性的只读操作。一旦执行完毕,Digest::MD5 对象会自动重置,并可用于计算另一个摘要值。如果要在不重置摘要状态的情况下计算摘要,请调用 $md5->clone->digest。

$md5->十六进制摘要

与 $md5->digest 相同,但将以十六进制形式返回摘要。返回的字符串的长度为 32,它只包含这个集合中的字符:'0'..'9' 和 'a'..'f'。

于 2012-02-28T20:33:51.390 回答
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; 
}

如果您运行代码,您会看到摘要仅在第一次更改,此时 $digest 第一次被分配。之后,摘要不会更改。

addpath 似乎是由 Digest::MD5::File 而不是 Digest::MD5 本身提供的,所以我已经更改了您示例中的 use 语句。

于 2012-02-28T20:35:03.220 回答