2016-07-21 112 views
2

我正在使用Perl v5.16.2Perl字符串怪异:等于字符串不相等?

我正在使用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\[email protected]" 

所以,至少我看到有一个区别字符串,但是为什么它不被hexdump看到,那是什么\ c @?

谢谢!

+0

难道这不是垃圾在源文件? –

+0

'\ c @'可能是Ctrl- @的表示,它是空字符。 C将空字符视为字符串结束标记。 Perl通常不会,但*某些*似乎是错误地处理空字符。 –

+0

在SQLite中使用'$ message_id'时会出现什么错误?任何机会这不是一个简单的标量文本,而是一个对象/哈希引用?你粘贴的代码为我工作,但它没有'$ message_id'。你能否提供https://stackoverflow.com/help/mcve来显示问题? – Robert

回答

4

\[email protected]字符是按Ctrl @,这是在代码点的ASCII NULL字符零

你不能看到它在你hexdump输出,因为它是从00填充区分在转储结束

如果设置$Data::Dumper::Useqq = 1那么它将在输出可见从print Dumper $message_id

您可以从变量中删除它通过使用s/\0\z//tr/\0//d,但你确实应该英伟stigate为什么它在那里首先

+0

Data :: Hexdumper决定这么做,而不是像'xxd'那样仅仅在最后切割一行就是非常不幸的巧合。 – hobbs

+0

@ hobbs:是的,它的设计很差 – Borodin

+0

嗨,是的,它是一个空字符。我用正则表达式去除了它。非常感谢你 ! – uski