Kapitel 5 - Konvertierung und Formatierung
Konvertierung - Strings in Zahl, Zahlen in Strings
Das gute an Perl ist, dass die
Konvertierung von Strings in Zahlen und von Zahlen in Strings,
automatisch funktioniert. Wollen Sie Strings in Zahlen konvertieren ...
#!/usr/bin/perl -w
use strict;
my $string = "12345";
my $string2 = "2.4e7";
my $string3 = " 123";
print my $wert = $string * 2 , "\n";
print $wert = $string2 + 1, "\n";
print $wert = $string3 + 0, "\n";
Dies wird übrigens intern mit der C-Funktion
atof() gemacht. An diesem Beispiel können Sie sehen, dass alle Strings richtig konvertiert wurden. Auch die Leerzeichen zu Beginn von 123 werden praktisch verschluckt. Ebenso Steuerzeichen wie \n, \t... werden ignoriert und stellen bei der Konvertierung kein Problem da. Falls Sie die Sprache C und die Funktion atof() kennen, wissen Sie ja, dass mit dieser Funktion die Hexdezimale und Oktale Zahlendarstellung nicht automatisch erkannt wird. Dafür können Sie die Funktionen hex(), octal() oder sprintf() verwenden.
Die
Konvertierung von Zahlen in Strings läuft ebenso automatisch ab. Intern verwendet diese Konvertierung die sprintf() -Funktion. Hier ein paar Beispiele der Konvertierung von Zahlen in Strings ...
#!/usr/bin/perl -w
use strict;
my $n=100;
my $n2=3;
my $number=$n/$n2;
print "Ergebnis : $number" , "\n";
Runden und Abschneiden von Zahlen
Um
Zahlen zu Runden haben Sie mehrere Möglichkeiten. Sie können den dezimalen Teil mit der Funktion
int() abschneiden ...
#!/usr/bin/perl -w
use strict;
my $number = 3.14;
my $num = 4.90;
print int($number) , "\n"; #wird zu 3
print int($num) , "\n"; #wird zu 4
An dieser Methode kann man sehen, dass einfach die letzte Stelle abgeschnitten wurde. Was ist aber, wenn man gerne bei der Zahl 4.90 auf den nächsten größeren Wert aufgerundet hätte?
Für das
Aufrunden auf die nächste größere Zahl übernimmt uns die Funktion
ceil() die Arbeit. Um diese Funktion verwenden zu können benötigen wir das
POSIX-Modul (welches Sie bei MS-Systemen höchstwahrscheinlich nachinstallieren müssen) ...
#!/usr/bin/perl -w
use strict;
use POSIX; #für ceil()
my $number = 3.14;
my $num = 4.90;
print ceil($number) , "\n"; #wird zu 4
print ceil($num) , "\n"; #wird zu 5
Und um die Zahl auf die
nächste tiefere Ganzzahl abzurunden verwenden Sie am Besten die Funktion
floor(), für die Sie ebenfalls das POSIX-Modul benötigen ...
#!/usr/bin/perl -w
use strict;
use POSIX; #für floor()
my $number = 3.14;
my $num = 4.90;
print floor($number) , "\n"; #wird zu 3
print floor($num) , "\n"; #wird zu 4
sprintf()
Mit Hilfe von
sprintf() können Sie
Strings in verschiedensten Formaten anzeigen. Mit sprintf() gelten schon die selben Formatierungszeichen wie Sie bei der Funktion printf() kennen gelernt haben ...
#!/usr/bin/perl -w
use strict;
print my $convert = sprintf "%c\n" , 65; #A
print $convert = sprintf "%s\n" , 3.141592; #3.141592 als String
print $convert = sprintf "%d\n" , "12345"; #String2Dezimal
print $convert = sprintf "%o\n" , 123; #Dezimal2Oktal
print $convert = sprintf "%x\n" , 255; #Dezimal2Hexdezimal
print $convert = sprintf "%e\n" , 12000.10; #exp. Darstellung
print $convert = sprintf "%f\n" , "234.2333"; #String2Gleitkomma
Wie schon mit printf, können Sie auch hier das Format erweitert formatieren ...
#!/usr/bin/perl -w
use strict;
print my $convert = sprintf "%.2f\n" , 3.141592;
print $convert = sprintf "%-10d\n" , "12345";
print $convert = sprintf "%5.2f\n" , "234.2333";
print $convert = sprintf "%#x\n" , 255;
print $convert = sprintf "%#o\n" , 255;
hex() und oct()
Um einen String in eine
Hexdezimale oder Oktale Zahl zu konvertieren, verwenden Sie die Funktionen
hex() und
oct() ...
#!/usr/bin/perl -w
use strict;
my $zugriff = "0750";
my $adress= "0xff";
print oct($zugriff), "\n"; #488
print hex($adress), "\n"; #255
Mit diesen beiden Funktionen wandeln Sie Hex.- oder Oktalzahlen in Dezimalzahlen um. Und nicht wie man schnell annehmen würde umgekehrt. Die Funktion oct() wird nicht auf Richtigkeit der Oktalen Zahleneingabe überprüft. Dies machen wir am besten mit einem
regulärem Ausdruck (mehr dazu Erfahren Sie in einem späteren Kapitel), der überprüft, ob der String mit '0' anfängt und keinem 'x' folgt ...
/^0[^x]\d*/
Wir wollen gleich ein kleines Beispiel schreiben, dass Strings in Hexdezimale oder als Oktale Zahlen ausgibt ...
#!/usr/bin/perl -w
use strict;
print "Bitte geben Sie ein Zahl in irgendeiner Form ihrer Wahl ein : ";
chomp($_=<>);
if(/^0[^x]\d*/){
print "Die Zahl ist eine Oktale : $_ -> " . oct($_) . "\n";
}
elsif(/^0x\d*/){
print "Die Zahl ist eine Hexdezimale : $_ -> " . hex($_) . "\n";
}
else{
print "Sie gaben ein : $_ \n";
}
Hier haben wir reguläre Ausdrücke verwendet, um zwischen Oktaler und Hexdezimaler oder auch keiner der beiden Zahlendarstellungen, als Strings unterscheiden können.
Hinweis: Auch wenn Ihnen in diesem Kapitel einiges nicht so klar erscheint (reguläre Ausdrück, for-Schleife ...), müssen Sie nicht verzweifeln. Zu diesen Themen kommen wir noch zu sprechen.
Zurück zu Kapitel 4 |
Zur Übersicht |
Weiter zu Kapitel 6
--
EnricoEhrhardt - 18 Aug 2008