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