3

ファイルが存在する場合は存在するかどうかを継続的にチェックし、ファイルの MD5 を以前の MD5 に対してチェックするコードを実行したかったのです。何らかの変更がある場合は、何らかのコードを実行します。しかし、perl MD% は、同じファイルに対して hexdigest を呼び出すたびに変化しているようです。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です。つまり、実行後に値がリセットされます。1 回しか読み取れませんが、2 回読み取ろうとします。初めて読むときは一時的に保存してください。

ドキュメントから(私の強調):

$md5->ダイジェスト

メッセージのバイナリ ダイジェストを返します。返される文字列の長さは 16 バイトです。

ダイジェスト操作は事実上、破壊的で一度だけの読み取り操作であることに注意してください。実行されると、Digest::MD5 オブジェクトは自動的にリセットされ、別のダイジェスト値の計算に使用できます。ダイジェスト状態をリセットせずにダイジェストを計算する場合は、$md5->clone->digest を呼び出します。

$md5->hexdigest

$md5->digestと同じですが、ダイジェストを 16 進形式で返します。返される文字列の長さは 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::File によって提供されているように見えるため、使用ステートメントを例から変更しました。

于 2012-02-28T20:35:03.220 に答える