2013-08-16T05:21:35
rucoGuten Morgen!
Ich habe eine Frage zu substr. Wenn ich in einer Schleife (abhängig von der Länge des Strings), einen String bearbeite, indem ich Teile lösche funktioniert das soweit ganz gut.
Wenn ich aber in der gleichen Schleife versuche dem String Zeichen hinzuzufügen führt das mit unter zu einer Endlosschleife. Irgendwie ist das auch verständlich, dass das nicht so einfach funktionieren kann, denn am Anfang wird ja die Länge des Strings bestimmt, die sich dann ja ändert. Nur warum kommt dann eine Endlosschleife zustande? Gibts eine einfache Lösung?
sub loeschen() {
my $f_content = $_[0];
my $c_number = $_[1];
Hier geht es schon los. In der ersten Zeile legst du fest, dass die Funktion keine Parameter bekommen soll. Dann nimmst du aber doch zwei.
Das geht nur, wenn du die Funktion mit &, das den Prototypen umgeht, aufrufst.
Besser:
sub loeschen {
my ($f_content, $c_number) = @_;
Und dann die Funktion ohne & aufrufen.
Noch besser wäre natürlich auch noch ein anderer Funktionsname.
Quote
my $state = "ok";
my $pos = 0;
my $record;
while ( ($pos+12) < length($f_content)) {
$record = substr($f_content,$pos+3,4);
if ($record == "2500" || $record == "2800") { substr($f_content,$pos,128, ""); } # löschen funktioniert
Sicher, dass das so ok ist? Du löscht 128 Zeichen, aber machst dann trotzdem $pos += 128, d.h. du überspringst den Datensatz danach. Gewollt?
Quote
if ($record == "1500" || $record == "1800") { substr($f_content,$pos,128, 0, " " x 128); } # einfügen nicht
Substr mit 5 Argumenten? Ich kenne nur 4 Argumente.
Quote
$pos += 128;
}
return $f_content, $state;
}
Ich würde mal zu Debug-Zwecken vor+nach jedem substr-Befehl mir die Variablen record, f_content und pos ausgeben. Damit solltest du dann sehen, wo der Fehler auftritt.
Noch eine Bemerkung: es ist oft einfacher, über einen konstanten String zu loopen und den neuen String mit den Ersetzungen komplett neu zu erstellen. Ewas zu verändern, über das man loopt, ruft nach Ärger.
Last edited: 2013-08-16 08:38:50 +0200 (CEST)