我正在使用Perl v5.16.2
我正在使用Net :: SMPP模块,它会返回一些数据。 如果我显示这些数据,我会得到这个(简化):
$VAR1 = bless( {
'receipted_message_id' => '400002F6E09C61701222120140',
'30' => '400002F6E09C61701222120140'
}, 'Net::SMPP::PDU' );
现在,让我们假设这些数据在$ pdu中,我这样做:
$message_id = $pdu->{30}; # or $pdu->{receipted_message_id}, same result
myfunction($message_id);
然后,我将myfunction定义为:
sub myfunction {
my $message_id = shift;
my $message_id_static = '400002F6E09C61701222120140';
print Dumper($message_id);
print Dumper($message_id_static);
print hexdump($message_id);
print hexdump($message_id_static);
if ($message_id eq $message_id_static)
{
print "match\n";
}
else
{
print "no match\n";
}
}
该计划的输出是:
$VAR1 = '400002F6E09C61701222120140';
$VAR1 = '400002F6E09C61701222120140';
Data::Hexdumper: data length isn't an integer multiple of lines
so has been padded with NULLs at the end.
0x0000 : 34 30 30 30 30 32 46 36 45 30 39 43 36 31 37 30 : 400002F6E09C6170
0x0010 : 31 32 32 32 31 32 30 31 34 30 00 00 00 00 00 00 : 1222120140......
Data::Hexdumper: data length isn't an integer multiple of lines
so has been padded with NULLs at the end.
0x0000 : 34 30 30 30 30 32 46 36 45 30 39 43 36 31 37 30 : 400002F6E09C6170
0x0010 : 31 32 32 32 31 32 30 31 34 30 00 00 00 00 00 00 : 1222120140......
no match
这对我没有任何意义......! 如果我尝试使用$ message_id来执行SQLite查询,那么它会失败。如果我改用$ message_id_static,那就完美了。
那么,这是一个奇怪的内部Perl错误,还是我错过了什么? 这让我疯了几个小时......
编辑:
使用perl调试器,我得到了这个:
DB<3> x $message_id_static
0 '400002F6E09C61701222120140'
DB<4> x $message_id
0 "400002F6E09C61701222120140\c@"
所以至少我看到字符串有区别,但是为什么它不会被hexdump看到,那是什么\ c @?
谢谢!
答案 0 :(得分:4)
\c@
字符是Ctrl- @,它是代码点0处的ASCII NUL字符
您无法在hexdump
输出中看到它,因为它与转储结束时的00
填充无法区分
如果您设置了$Data::Dumper::Useqq = 1
,那么它将在print Dumper $message_id
您可以使用s/\0\z//
或tr/\0//d
将其从变量中删除,但您应该首先调查它的原因