Как я могу сравнить контрольные суммы md5 в Perl? - PullRequest
2 голосов
/ 09 октября 2009

Я пытаюсь сравнить значение контрольной суммы файла. Одна переменная $a имеет контрольную сумму (вывод команды md5sum, только шестнадцатеричная часть) и то же значение находится в переменной $b.

Если я делаю ($a == $b), я получаю ошибку, но если я делаю ($a eq $b), это не равно.

Спасибо за ваши ответы, это сработало в сравнении строк после обрезки пробелов, хотя использование chomp не работает.

Ответы [ 3 ]

4 голосов
/ 09 октября 2009

Вы сравниваете строки, а не числа, поэтому используйте 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
4 голосов
/ 09 октября 2009

Убедитесь, что в ваших строках нет новых строк или других символов в конце. Если сомневаетесь, chomp() оба тогда сравните. Кроме того (просто чтобы скрыть чрезвычайно очевидное), они оба используют один и тот же регистр для кодирования шестнадцатеричных символов?

1 голос
/ 09 октября 2009

Если ($ a eq $ b) равно false, то они действительно не равны. Если вы исключили очевидные различия, такие как «filename:» на одном из них, вам нужно искать пробелы или непечатные различия символов. Самый простой способ сделать это:

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