我正在尝试比较文件的校验和值。
一个变量$a
具有校验和(md5sum
命令的输出,只有十六进制部分)
并且变量$b
中的值相同。
如果我这样做($a == $b
),我会收到错误,但如果我($a eq $b)
,则表示错误。
感谢您的回答,它在修剪白色空间后进行了字符串比较,尽管使用chomp不起作用。
答案 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);