为什么Perl中的base64字符串比较失败?

时间:2009-11-14 22:12:41

标签: perl base64

我试图将encode_base64('test')与包含base64字符串'test'的字符串变量进行比较。问题是它永远不会验证!

use MIMI::Base64 qw(encode_base64);

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

我忘了什么吗?

3 个答案:

答案 0 :(得分:10)

Here's指向Perlmonks页面的链接,上面写着“注意encode_base64()编码字符串末尾的换行符”。

所以简单的'eq'可能会失败。

要取消换行符,请改为encode_base64("test", "")

答案 1 :(得分:8)

当您进行字符串比较并且意外失败时,请打印字符串以查看其中的实际内容。我在值周围放置括号以查看任何额外的空格:

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", "")

答案 2 :(得分:0)

这是一个有趣的提示:使用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;

使用perlprove运行该脚本,它不会只是告诉您它不匹配,它会说:

#   Failed test '"test" encodes okay'  
#   at testbase64.pl line 6.
#          got: 'gGVzdA==
# '
#     expected: 'dGVzdA=='
敏锐的读者会注意到两者之间的区别确实是换行符。 :)