2009-11-14 88 views
4

我想將encode_base64('test')與包含'test'的base64字符串的字符串變量進行比較。問題是它永遠不會驗證!爲什麼Perl中的base64字符串比較失敗?

use MIMI::Base64 qw(encode_base64); 

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

我忘了什麼嗎?

+0

如果你想調試這一點,你需要輸出'encode_base64(「測試」)的值',而不是盲目地檢查它與另一個字符串相等。 – jtbandes

+1

您可能想要查看http://stackoverflow.com/questions/49652/are-there-any-good-automated-test-suites-for-perl,而不是手動驗證您的測試。 – TrueWill

回答

10

Here's指向Perlmonks頁面的鏈接,其中指出「謹防encode_base64()編碼字符串末尾的換行符」。

所以簡單的'eq'可能會失敗。

爲了抑制換行符,請改爲encode_base64("test", "")

+1

是真的!謝謝!應該更加關注我的印刷品 – Bob

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

和眼尖讀者會注意到兩者的區別確實是換行符。 :)