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!
Könnte das nicht Müll in der Quelldatei sein? –
'\ 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. –
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