PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: split verschluckt Felder



Christoph
21-03-2003, 14:35
Hallo Perl-Hacker,

habe gerade bemerkt, dass split() leere Felder verschluckt.
Beispiel:


$string = "a;b;;"
@felder = split(';',$string);
print "$#felder\n"; # gibt 1 aus (statt 3)

Kann man es hinkriegen, dass alle Felder berücksichtigt werden?

Randbemerkung: Dasselbe Problem hat die ANSI C-Funktion strtok()

fork
21-03-2003, 16:56
Die 1 ist der Index des höchsten Arrayfeldes, d. h. es gibt 2 Feldelemente, da ja das erste Feld den Index 0 hat. Leere Felder am Ende eines Strings werden wohl nicht einbezogen. Wenn einem leeren Wert ein nicht leerer Wert folgt wird leere auch wieder mitgezählt(wie ein Test zeigte). Wenn Du die Anzahl der Felder haben willst kannst Du z. B. das Array in skalarem Kontext verwenden.
z. B.:

print @felder."\n";
oder explizit mit:

print scalar(@felder)."\n";
Das genaue Verhalten von split kannst Du mit Hilfe von: perldoc -f split nachlesen

Christoph
21-03-2003, 19:14
Danke für die Anregung, am Ende nicht leere Felder hinzuzufügen.
Ich habe das Problem wie folgt gelöst:


$string = "a;b;;"
@felder = split(';', $string . ';bla');
pop @felder;

Falls also leere Felder möglich sind, sollte man wohl besser
immer so verfahren.

Da Du vehement darauf hinweist:
Was ist an scalar(@felder) besser als an $#felder?

fork
21-03-2003, 22:37
> Was ist an scalar(@felder) besser als an $#felder?

Gar nichts, ich wollte nur den Sinn der "1" erklären. Ich selbst wäre viel zu faul statt $#felder+1 scalar(@felder) zu schreiben, sind ja 5 Zeichen mehr. :)