2016-07-21 10 views
2

Ich benutze Perl v5.16.2Perl String Verrücktheit: gleiche Strings nicht gleich?

Ich benutze die Net :: SMPP-Module und es gibt mir einige Daten zurück. Wenn ich diese Daten zeigen, erhalte ich diese (vereinfacht):

$VAR1 = bless({ 
       'receipted_message_id' => '400002F6E09C61701222120140', 
       '30' => '400002F6E09C61701222120140' 
       }, 'Net::SMPP::PDU'); 

Nun lassen Sie uns diese Daten übernehmen in $ pdu ist und ich dies tun:

$message_id = $pdu->{30}; # or $pdu->{receipted_message_id}, same result 
myfunction($message_id); 

Dann habe ich myfunction definiert als :

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"; 
    } 
} 

die Ausgabe des Programms ist:

$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 

Was für mich keinen Sinn ergibt ...! Wenn ich versuche, $ message_id zu verwenden, um eine SQLite-Abfrage auszuführen, schlägt es kläglich fehl. Wenn ich stattdessen $ message_id_static verwende, funktioniert es perfekt.

Also, ist das ein seltsamer interner Perl-Bug, oder fehle ich etwas? Dies wurde mir Nuss stundenlang fahren ...

EDIT:

die Perl-Debugger verwenden, bekomme ich diese:

DB<3> x $message_id_static 
0 '400002F6E09C61701222120140' 
    DB<4> x $message_id 
0 "400002F6E09C61701222120140\[email protected]" 

Also zumindest ich sehe, gibt es einen Unterschied in die Strings, aber warum wird es nicht vom Hexdump gesehen, und was ist das \ c @?

Danke!

+0

Könnte das nicht Müll in der Quelldatei sein? –

+0

'\ c @' ist wahrscheinlich eine Darstellung von Ctrl- @, welches das Nullzeichen ist. C behandelt das Nullzeichen als ein Ende der Zeichenfolgenmarkierung. Perl tut das im Allgemeinen nicht, aber * etwas * scheint Null-Zeichen falsch zu behandeln. –

+0

Welchen Fehler erhalten Sie, wenn Sie '$ message_id' in SQLite verwenden? Gibt es eine Chance, dass dies kein einfacher Skalentext ist, sondern eine Objekt-/Hash-Referenz? Der Code, den du eingefügt hast, hat für mich funktioniert, aber er hat nicht die '$ message_id'. Können Sie https://stackoverflow.com/help/mcve angeben, um das Problem zu zeigen? – Robert

Antwort

4

Der \[email protected] Charakter ist Strg- @, die die ASCII-NUL-Zeichen in Codepunkt Null

Sie können sehen, es nicht in Ihrem hexdump ausgegeben, weil es von der 00 Polsterung am Ende der Deponie nicht zu unterscheiden ist

Wenn Sie setzen $Data::Dumper::Useqq = 1 dann wird es in der Ausgabe von print Dumper $message_id

sichtbar sein Sie können es von den variablen entfernen, indem s/\0\z// oder tr/\0//d verwenden, aber Sie sollten wirklich inve stigate warum es in erster Linie dort ist

+0

Wirklich unglücklicher Zufall, dass Data :: Hexdumper sich dafür entscheidet, anstatt nur die Zeile am Ende wie 'xxd' kurz zu schneiden. – hobbs

+0

@hobbs: Ja, es ist wirklich schlechtes Design – Borodin

+0

Hallo, ja, es war ein Null-Zeichen. Ich habe es mit einem Regexp losgeworden. Vielen Dank ! – uski

Verwandte Themen