Почему это сравнение строк base64 в Perl не удается? - PullRequest
4 голосов
/ 15 ноября 2009

Я пытаюсь сравнить encode_base64('test') со строковой переменной, содержащей строку base64 'test'. Проблема в том, что она никогда не проверяется!

use MIMI::Base64 qw(encode_base64);

if (encode_base64("test") eq "dGVzdA==")
{
    print "true";
}

Я что-то забыл?

Ответы [ 3 ]

10 голосов
/ 15 ноября 2009

Вот ссылка на страницу Perlmonks с надписью «Остерегайтесь новой строки в конце кодированных строк encode_base64 ()».

Так что простой 'eq' может потерпеть неудачу.

Чтобы подавить символ новой строки, скажите encode_base64("test", "").

8 голосов
/ 15 ноября 2009

Когда вы выполняете сравнение строк, и оно неожиданно завершается неудачей, выведите строки, чтобы увидеть, что на самом деле в них. Я ставлю скобки вокруг значения, чтобы увидеть дополнительные пробелы:

use MIME::Base64;

$b64 = encode_base64("test");

print "b64 is [$b64]\n";

if ($b64 eq "dGVzdA==") {
   print "true";
}

Это базовая техника отладки с использованием лучшего из когда-либо изобретенных отладчиков. Привыкайте к нему много. :)

Кроме того, иногда вам нужно пару раз прочитать документацию, чтобы поймать важные детали. В этом случае MIME :: Base64 говорит вам, что encode_base64 принимает два аргумента. Второй аргумент - это конец строки, по умолчанию это перевод строки. Если вам не нужна новая строка в конце строки, вам нужно задать ей еще один конец строки, например, пустую строку:

encode_base64("test", "")
0 голосов
/ 17 ноября 2009

Вот интересный совет: используйте замечательные и любимые тестовые модули Perl для отладки. Это не только даст вам преимущество при тестировании, но иногда они сделают ваши результаты отладки намного быстрее. Например:

#!/usr/bin/perl
use strict;
use warnings;
use Test::More 0.88;
BEGIN { use_ok 'MIME::Base64' => qw(encode_base64) }

is( encode_base64("test", "dGVzdA==", q{"test" encodes okay} );
done_testing;

Запустите этот скрипт с perl или с prove, и он не просто скажет вам, что он не соответствует, но и скажет:

#   Failed test '"test" encodes okay'  
#   at testbase64.pl line 6.
#          got: 'gGVzdA==
# '
#     expected: 'dGVzdA=='

и проницательные читатели заметят, что разница между ними - действительно новая строка. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...