Perl字符串古怪:相等的字符串不相等?

时间:2016-07-21 22:32:44

标签: string perl debugging

我正在使用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 @?

谢谢!

1 个答案:

答案 0 :(得分:4)

\c@字符是Ctrl- @,它是代码点0处的ASCII NUL字符

您无法在hexdump输出中看到它,因为它与转储结束时的00填充无法区分

如果您设置了$Data::Dumper::Useqq = 1,那么它将在print Dumper $message_id

的输出中显示

您可以使用s/\0\z//tr/\0//d将其从变量中删除,但您应该首先调查它的原因