使用perl md5比较两个文件

时间:2012-02-28 19:56:07

标签: perl md5 file-comparison

我想运行一个代码,如果文件存在,则继续检查文件是否退出,然后检查文件的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;
            }
    }
}

2 个答案:

答案 0 :(得分:8)

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

documentation(我的重点):

  

$ MD5-&GT;消化

     

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

     

请注意,摘要操作实际上是 破坏性,只读操作 。一旦执行,Digest :: MD5   对象自动重置,可用于计算另一个   消化值。如果要计算,请调用$ md5-&gt; clone-&gt; digest   消化而不重置摘要状态。

     

$ MD5-&GT; hexdigest

     

与$ md5-&gt; digest 相同,但会以十六进制格式返回摘要。返回的字符串的长度为32,仅为   包含此集合中的字符:'0'..'9'和'a'..'f'。

答案 1 :(得分: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语句。