Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Eine Stringkonstante "interpetieren"
Hallo Forum,
ich brauche die genaue Stringlänge einer Stringkonstanten, die folgendermaßen
aussieht:
--> "String mit Umlaut ""\xFC"" \n" <--
D.h. der String müsste interpretiert werden und danach müsste die Länge gemessen werden. Wie kann ich soetwas in Perl realisieren?
Zur Zeit entferne ich einfach alle "\"" und alle Hexdarstellungen von Umlauten und "\\".
Gruss Rene
michael.sprick
28-06-2005, 10:14
Solange der String zwischen doppelten Anführungszeichen steht, wird er auch interpoliert - nicht jedoch bei einfachen ' ....
$var = "String"; # 6 zeichen
print "'$var' hat " . length($var) . " Zeichen\n";
$var = "String \"\xFC\""; # 10 Zeichen
print "'$var' hat " . length($var) . " Zeichen\n";
Danke erstmal für die schnelle Antwort, dass ist aber leider nicht was ich suche.
Hier mal mein Code:
sub work_line {
my $line=$_[0];
# findet '#define STRING "string"'
if($line=~ /^#define\s*(\w+ *?)\s*(".+ *?)/) {
my $name=$1;
my $len=$2;
print dest "#define\t".$name."_LEN\t\t".length($len)."\n"
}
}
Die Eingabezeile sieht so aus:
#define STRING "string ""\xFC"" \n"
Die Ausgabe ist nun
#define STRING_LEN 20
weil der string -->"string ""\xFC"" \n"<-- ist und nicht
-->"string ü
"<--, was mir die korrekte Länge ausgeben würde.
Wie kann ich diesen String interpolieren?
Danke Rene
michael.sprick
28-06-2005, 17:29
Hmmm... schwierig.
selbst wenn es eine Funktion gibt, die das interpolieren sozusagen erzwingt, müsstest Du immernoch die " rauskriegen, denn die dürfen ja auch nicht als Zeichen gezählt werden...Soweit ich das jetzt überblicke, müsstest Du also eh einen regexp bemühen...
while(<DATA>)
{
if(/^#define\s*(\w+ *?)\s*(".+ *?)/)
{
my ($name,$len)=($1,$2);
$len =~ s/"//g;
$len =~ s/\\x.{2}|\\./ /gi;
print $len . length($len);
}
}
__DATA__
#define STRING "string ""\xFC"" \n"
Vorausgesetzt, ich habe es richtig verstanden, dass Du \n als ein Zeichen und \xFC als ein Zeichen zählen willst...
Hallo,
gibt es wirklich keine Möglichkeit mit Perl, eine String wie mit dem Präprozessor von C zu behandeln, das wäre doch mal eine neue Funktion wert? :rolleyes:
@michael.sprick:
Eine ähnliche Lösung hatte ich schon, ich dachte das es vielleicht was besseres gibt, denn einfach alle Gänsefüßchen zu entfernen und alle 2 Zeichen nach einem x, ist abenteuerlich.
Mein Problem hat sich sowieso erledigt. Ich wollte meinen c-Quellkode nach Stringkonstanten durchsuchen und für jede Konstante einen neues Makro definieren, welches den Namen der Konstanten hat + dem Bezeichner '_LEN' und die Stringlänge enthält. Damit wollte ich solche unschönen Sachen wie
/* Achtung c-Kode */
/* Stringkonstant-länge ist schon zur Kompilierzeit bekannt, wird aber zur
Laufzeit gemessen */
button.y = (getmaxy(stdscr)/2) / (strlen(MAIN_TITLE)/2);
loswerden. Nach ausführlichem Studium meiner Compilerdokumentation stellte ich fest, dass der gcc mit der Optimierungsoption soetwas wegoptimiert.
Ein Lob an die Entwickler!
Gruss Rene
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.