2009-11-14 7 views
4

J'essaie de comparer un encode_base64('test') à la variable chaîne contenant la chaîne base64 de 'test'. Le problème est qu'il ne valide jamais!Pourquoi cette comparaison de chaîne base64 en Perl échoue?

use MIMI::Base64 qw(encode_base64); 

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

Ai-je oublié quelque chose?

+0

Si vous essayez de déboguer ceci, vous devez sortir la valeur de 'encoder_base64 (" test ")' plutôt que de le vérifier aveuglément pour l'égalité avec une autre chaîne. – jtbandes

+1

Vous voudrez peut-être vérifier http://stackoverflow.com/questions/49652/are-there-any-good-automated-test-suites-for-perl plutôt que de vérifier manuellement vos tests. – TrueWill

Répondre

10

Here's un lien vers une page Perlmonks qui dit "Méfiez-vous du saut de ligne à la fin des chaînes encodées encode_base64()".

Ainsi, le simple 'eq' peut échouer.

Pour supprimer le saut de ligne, dites plutôt encode_base64("test", "") à la place.

+1

vrai! Merci! aurait dû accorder plus d'attention à mon impression – Bob

8

Lorsque vous effectuez une comparaison de chaînes et que celle-ci échoue de façon inattendue, imprimez les chaînes pour voir leur contenu. Je mets entre parenthèses autour de la valeur pour voir les espaces blancs supplémentaires:

use MIME::Base64; 

$b64 = encode_base64("test"); 

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

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

Ceci est une technique de débogage de base en utilisant le meilleur débogueur jamais inventé. Habituez-vous à l'utiliser beaucoup. :)

Aussi, parfois vous avez besoin de lire la documentation pour les choses quelques temps pour attraper les parties importantes. Dans ce cas, MIME::Base64 vous indique que encode_base64 prend deux arguments. Le deuxième argument est la fin de la ligne et par défaut un saut de ligne. Si vous ne voulez pas une nouvelle ligne à la fin de la chaîne que vous devez donner une autre fin de ligne, comme la chaîne vide:

encode_base64("test", "") 
0

Voici une astuce intéressante: utiliser des modules de test merveilleux et bien-aimé de Perl pour le débogage. Non seulement cela vous donnera une longueur d'avance sur les tests, mais parfois, ils rendront votre sortie de débogage beaucoup plus rapide. Par exemple:

#!/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; 

Exécuter ce script, avec perl ou avec prove, et il ne sera pas seulement vous dire que cela ne correspondait pas, il dira:

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

et l'œil vif les lecteurs remarqueront que la différence entre les deux est en effet la nouvelle ligne. :)

Questions connexes