为什么encode_base64的结果与decode_base64不对应?

时间:2013-03-21 08:26:37

标签: perl

$ perl -MMIME::Base64 -e 'print encode_base64("syn_ack@163.com");'
c3luX2Fjay5jb20=
$ perl -MMIME::Base64 -e 'print decode_base64("c3luX2Fjay5jb20=");'
syn_ack.com

编码结果无法解码为原始字符串,为什么?

3 个答案:

答案 0 :(得分:2)

您必须将@转义为\@或使用不同的引号。 这是因为双引号被展开,@163被视为数组@163(即使此名称不是有效的标识符)。

这可以按预期工作:

perl -MMIME::Base64 -e "print encode_base64('syn_ack@163.com');"
c3luX2Fja0AxNjMuY29t

perl -MMIME::Base64 -e 'print encode_base64("syn_ack\@163.com");'
c3luX2Fja0AxNjMuY29t

perl -MMIME::Base64 -e "print decode_base64('c3luX2Fja0AxNjMuY29t');"
syn_ack@163.com

答案 1 :(得分:1)

切换报价。 Perl将在使用双引号时插入变量。

$ perl -MMIME::Base64 -e "print encode_base64('syn_ack@163.com');"
c3luX2Fja0AxNjMuY29t
$ perl -MMIME::Base64 -e "print decode_base64('c3luX2Fja0AxNjMuY29t');"
syn_ack@163.com

http://perlmeme.org/howtos/using_perl/interpolation.html

答案 2 :(得分:1)

当您使用Perl看到意外结果时,请确保已启用警告。

$ perl -w -MMIME::Base64 -e 'print encode_base64("syn_ack@163.com");'
Possible unintended interpolation of @163 in string at -e line 1.
c3luX2Fjay5jb20=

单引号('')字符串中没有插值,因此您可以运行

perl -w -MMIME::Base64 -e 'print encode_base64('syn_ack@163.com');'

或保留双引号("")并转义@

perl -w -MMIME::Base64 -e 'print encode_base64("syn_ack\@163.com");'

输出

c3luX2Fja0AxNjMuY29t

解码给出了

$ perl -w -MMIME::Base64 -e 'print decode_base64("c3luX2Fja0AxNjMuY29t");'
syn_ack@163.com