FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Perl, Arrays und garstige Leerzeichen

Perl, Arrays und garstige Leerzeichen 2003-11-14 13:08
Popcorn
Ich scheiter gerade an einem Problem, das sicher ganz simpel ist, aber auf dessen Lösung ich trotzdem nicht kommen. Dazu kommentiere ich mal kurz den relevanten Quelltextauszug aus der Funktion "Eintrag löschen":

undef @Overview; open(DATABASE, "<faqlist.txt") || die &error; while() { ($themenbereich2,$entry_id2,$headline2,$userid2,$datum2)=split(/\|/,$_); if($parameter ne $entry_id2) {Hier wird die Übersicht geladen. Jede Zeile des Textfiles enthält Infos zu genau einem Eintrag. Aus der Zeile hole ich kurz die id des Eintrages und prüfe, ob es sich um den zu löschenden Eintrag handelt.

chop($_); push(@Overview,$_."\n"); } }
Wenn dies nicht der Fall ist, führe ich noch ein, glaube ich ziemlich überflüssiges, chop aus und klatsche die Zeile mit einem Zeilenumbruch am Ende in den Array… ->

open(GENERATED, ">faqlist.txt"); print GENERATED "@Overview"; close(GENERATED);… der dann gespeichert wird.

Das dämliche ist nur, dass außer in der ersten Zeile, alle weiteren Zeilen im Textfile von einem Leerzeichen angeführt werden. Ich habe mir die Ergebnisse an verschiedenen Stellen angesehen. Es ist alles in Ordnung. Bei Ausgabe des kompletten Arrays schließlich, findet sich am Ende jeder Zeile ein Leerzeichen. Die einzelnen Zeilen beginnen aber bündig am Anfang. Liegt der Fehler beim Speichern?

Re: Perl, Arrays und garstige Leerzeichen 2003-11-14 13:14
TriPhoenix
open(GENERATED, ">faqlist.txt"); print GENERATED "@Overview"; close(GENERATED);… der dann gespeichert wird.
Wenn ich richtig erinnere, führt print mit einem Array in "" dazu, dass die Arrayelemente durch ein Space getrennt werden. Versuchs mal ohne die "".

Zusatz:
triphoenix@triphoenix root $ perl -e '@foo= ("foo", "bar", "baz"); print @foo; print"\n--- \n";print "@foo"; print"\n";' foobarbaz --- foo bar baz

Re: Perl, Arrays und garstige Leerzeichen 2003-11-14 13:23
low_level
chop($_); push(@Overview,$_."\n"); } }

Statt chop() solltest Du immer chomp() verwenden.

open(GENERATED, ">faqlist.txt"); print GENERATED "@Overview"; close(GENERATED);

Und hier würde ich statt print "@Overview" immer print join(" ", @Overview)."\n" schreiben. Ich habe nämlich eine Abneigung gegen alle Perl-Konstrukte, die mehrdeutig sein könnten.

Bei "@Overview" gibt es eine dieser kryptischen Perlvariablen, die den String für den Zwischenraum angibt.

$": This is like $, except that it applies to array and slice values interpolated into a double-quoted string (or similar interpreted string). Default is a space. (Mnemonic: obvious, I think.)

low_level

Re: Perl, Arrays und garstige Leerzeichen 2003-11-14 13:27
Popcorn
Thx, Tri. [img]http://unimatix.sternenvolk.de/gfx/14.gif[/img] Die "-fangen mich langsam an zu nerven. Wo die überall Probleme verursachen können. [img]http://unimatix.sternenvolk.de/gfx/22.gif[/img]

@low: Ne, ja. chomp() will bei mir gelegentlich nicht das Ende wegnehmen. Vielleicht weil da auch Leerzeichen von "-Zeichen auftauchen oder so. Bisher bin ich mit einem gnadenlosen abschneiden immer besser gefahren.

Und was ist an print GENERATED @Overview; zweideutig? Kein Plan. %) Danke trotzdem. :)

Re: Perl, Arrays und garstige Leerzeichen 2003-11-14 13:32
low_level
@low: Ne, ja. chomp() will bei mir gelegentlich nicht das Ende wegnehmen. Vielleicht weil da auch Leerzeichen von "-Zeichen auftauchen oder so. Bisher bin ich mit einem gnadenlosen abschneiden immer besser gefahren.

na gut, dann halt

s/[\r\n\s]+$//;

Und was ist an print GENERATED @Overview; zweideutig? Kein Plan. %) Danke trotzdem. :)

Ich finde bloß join($trenner, @array) expliziter. Da steht dann auch drin, was Du als Trennzeichen haben willst. Bei "@array" steht eigentlich nur "gib das aus".

low_level