如何比较Perl中的md5校验和?

时间:2009-10-09 15:10:03

标签: perl comparison md5

我正在尝试比较文件的校验和值。 一个变量$a具有校验和(md5sum命令的输出,只有十六进制部分) 并且变量$b中的值相同。

如果我这样做($a == $b),我会收到错误,但如果我($a eq $b),则表示错误。

感谢您的回答,它在修剪白色空间后进行了字符串比较,尽管使用chomp不起作用。

3 个答案:

答案 0 :(得分:4)

确保您的字符串末尾没有换行符或其他字符。如果有疑问,chomp()两者都会进行比较。另外(只是为了掩盖非常明显的),他们都使用相同的情况来编码十六进制字符?

答案 1 :(得分:4)

您正在比较字符串,而不是数字,因此请使用eq 还可以使用lc()chomp()$a=~s/^\s+//;$a=~s/\s+$//; 您可以使用hex()并使用==将输入转换为数字。 尝试:

if (hex($a) == hex($b)){}

这完全取决于您处理md5sum命令输出的程度。我看起来像这样:

dlamblin$ md5 .bash_history 
MD5 (.bash_history) = 61a4c02cbd94ad8604874dda16bdd0d6

所以我用这个处理它:

dlamblin$ perl -e '$a=`md5 .bash_history`;$a=~s/^.*= |\s+$//g;print $a,"\n";'
61a4c02cbd94ad8604874dda16bdd0d6

现在我注意到hex()有一个整数溢出错误,因此您需要use bigint;

dlamblin$ perl -e '
$a=`md5 .bash_history`;$a=~s/^.*= |\s+$//g;print hex($a),"\n";'
Integer overflow in hexadecimal number at -e line 1.
1.29790550043292e+38
dlamblin$ perl -Mbigint -e '
$a=`md5 .bash_history`;$a=~s/^.*= |\s+$//g;print hex($a),"\n";'
129790550043292010470229278762995667158

答案 2 :(得分:1)

如果($ a eq $ b)为假,那么它们确实不相等。如果你排除了其中一个明显的差异,如“filename:”,你需要寻找空格或不可打印的字符差异。这样做的简单方法是:

use Data::Dumper;
$Data::Dumper::Useqq=1;
print Dumper($a);
print Dumper($b);