【问题标题】:Comparing two files using perl md5使用 perl md5 比较两个文件
【发布时间】:2012-03-18 07:52:25
【问题描述】:

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

【问题讨论】:

  • 如果你使用了“use strict”,就不会出现这个问题。请use strict

标签: perl md5 file-comparison


【解决方案1】:

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

来自documentation(我的重点):

$md5->摘要

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

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

$md5->十六进制摘要

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

【讨论】:

  • 谢谢!!那行得通!但是,当文件发生更改时(我通过将新文件复制到该名称来更改文件)更改被检测到两次并且 else 部分执行了两次。所以我做了小修改(每第二次更改执行 else)它工作。
【解决方案2】:

我没有看到这个问题。这是您要执行的操作的简短版本:

#!/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 语句。

【讨论】:

    猜你喜欢
    • 2018-08-17
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多