2016-06-03 5 views
2

Ich habe einen Code wie diesen.Sprintf in Perl zeigt Hexadezimalzeichen nicht richtig an

 $entry = &function(); //returns a number between 0 to 20 
    $var = sprintf("%#.4x", $entry); 
    if($var=~ /$hex/) 
    { 
     //block of statements 
     } 

$ hex wird innerhalb 0x0000 sein ..... 0x0014. Wenn nun function von 1 bis 20 zurückkehrt, entspricht $ var $ hex. (Wie 0x0001 .... 0x0014)

Wenn $ entry jedoch 0 ist, wird $ var 0000. Aber ich möchte, dass es 0x0000 ist. Momentan überprüfe ich, ob das 0000 ist, ich ändere es durch eine if-Schleife. Bitte lassen Sie mich wissen, ob das im Sprint selbst möglich ist.

Antwort

7

Gemäß der Dokumentation für sprintf:

Flaggen
# Präfix Nicht-Null hexadezimal mit "0x" oder "0X"

Beachten Sie, dass es non-zero sagt, so dass nur Werte ungleich 0 werden mit 0x vorangestellt.

Eine einfache Lösung ist das Präfix manuell hinzuzufügen:

sprintf "0x%04x", $entry; 
+1

Ich habe diese Antwort gewählt, da sie sowohl die Erklärung als auch eine Lösung für Null umfasst. – SibiCoder

2

Die Doc erwähnt deutlich, dass 0x nur für Nicht-Null-Nummern angehängt, wenn # Flag used.This macht da null Sinn ist Null, ob es ist in Oktal oder Hexadezimal. Daher macht es keinen Sinn mit 0x vorangestellt.

Der beste Weg, dies zu handhaben wäre:

if($var=~ /$hex/ or !$var) 
+1

In unserem Skript gibt es eine Literal-Match-Funktion, die wir verwenden müssen, prüft auf 0x0000, hält das nicht für gleich 0. – SibiCoder

2

Klingt wie Sie Dinge rückwärts tun. Wäre das Folgende nicht sinnvoller?

if ($entry == hex($hex)) 

Wenn Sie Zahlen vergleichen möchten, vergleichen Sie die Zahlen, nicht ihre Textdarstellung.

+0

Entschuldigung, Wir vergleichen die Ausgabe von einem Gerät mit der erwarteten. Also, "Übereinstimmung wird wörtlich genommen", was bedeutet, dass abgesehen von der Anzahl der Leerzeichen alle Zeichen in einer Zeile so angepasst werden müssen, wie sie sind. Es erfolgt keine Auswertung der Anzahl oder der Strings. Unser Rahmen ist so. Ich gab ein kleines Beispiel, um etwas darüber zu erfahren. – SibiCoder

+0

Kühl. Ich werde das hier trotzdem lassen, falls es anderen hilft. – ikegami