2016-07-21 28 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バグですか、何か不足していますか? これは...時間私に

EDITナットを駆動されています。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は一般的にそうではありませんが、*何かがnull文字を間違って扱っているようです。 –

+0

SQLiteで '$ message_id'を使用すると、どのようなエラーが発生しますか?これは普通のスカラーテキストではなく、オブジェクト/ハッシュリファレンスです。あなたが貼り付けたコードは私のために働いていましたが、 '$ message_id'を持っていませんでした。問題を表示するためにhttps://stackoverflow.com/help/mcveを提供できますか? – Robert

答えて

4

\[email protected]文字が、それはダンプの終わりに00パディングと区別がつかないので、あなたは、あなたのhexdump出力でそれを見ることができないコード・ポイントでのASCII NUL文字ではCtrl- @、ゼロ

です

あなたが$Data::Dumper::Useqq = 1を設定した場合、それはあなたがs/\0\z//tr/\0//dを使用して変数から削除することができますが、あなたが本当にinveべきprint Dumper $message_id

からの出力に表示されますそれが最初にある理由を教えてください

+0

Data :: Hexdumperが 'xxd'のように最後の行を省略するのではなく、これを行うことを決めるのは本当に残念なことです。 – hobbs

+0

@hobbs:はい、それは本当に貧しいデザインです – Borodin

+0

こんにちは、はいそれはnull文字でした。私は正規表現でそれを取り除きました。どうもありがとうございました ! – uski

関連する問題