Moin,
When ich mittels perl² ein File parsen will, definiere ich mir einfach einen Filehandler, mache dann das Teil mittels open() auf und kann mittels while() zeilenweise durchscannen. Fein. Jetzt habe ich ein File vorliegen, in dem die Zeilenenden auf DOS-Enter enden, will sagen ausschließlich auf dieses Zeichen und kein normales Enter-Zeichen (Beispiel hängt an). Dann hängt sich der Parser weg und erkennt nichts mehr. Gibts dafür eine triviale Lösung? Konkret gehts mir um: http://bugs.debian.org/107258 .
Thanks, H.
² Disclaimer: Ich hab nicht viel Aenung von Perl
Am Freitag, 16. April 2004 12:33 schrieb Hilmar Preusse:
Moin,
When ich mittels perl² ein File parsen will, definiere ich mir einfach einen Filehandler, mache dann das Teil mittels open() auf und kann mittels while() zeilenweise durchscannen. Fein. Jetzt habe ich ein File vorliegen, in dem die Zeilenenden auf DOS-Enter enden, will sagen ausschließlich auf dieses Zeichen und kein normales Enter-Zeichen (Beispiel hängt an). Dann hängt sich der Parser weg und erkennt nichts mehr. Gibts dafür eine triviale Lösung?
chomp (perldoc -f chomp) ist die Funktion, die in Perl jegliches "Newline"-Zeichen entfernt. Bei der Ausgabe müsste man dann allerdings das korrekte Zeichen ("\n") an jede Zeile wieder anhängen.
HTH.
Andreas Richter
On 16.04.04 Andreas Richter (ar5@rcs.urz.tu-dresden.de) wrote:
Am Freitag, 16. April 2004 12:33 schrieb Hilmar Preusse:
Moin,
When ich mittels perl² ein File parsen will, definiere ich mir einfach einen Filehandler, mache dann das Teil mittels open() auf und kann mittels while() zeilenweise durchscannen. Fein. Jetzt habe ich ein File vorliegen, in dem die Zeilenenden auf DOS-Enter enden, will sagen ausschließlich auf dieses Zeichen und kein normales Enter-Zeichen (Beispiel hängt an). Dann hängt sich der Parser weg und erkennt nichts mehr. Gibts dafür eine triviale Lösung?
chomp (perldoc -f chomp) ist die Funktion, die in Perl jegliches "Newline"-Zeichen entfernt.
Erstmal danke für die Antwort. Minimalbeispiel:
#!/usr/bin/perl -w
open (BABY,"BabyTuX_color.eps"); while (<BABY>) { chomp(); print "$_\n"; } close (BABY);
Das file was rauskommt ist identisch, zu dem was reinkommt. Ich hab jetzt nochmal meine Literatur gewälzt. Es gibt den $/ ($INPUT_RECORD_SEPARATOR). Der ist lt. Literatur auf den normalen Zeilenvorschub eingestellt, als IMHO nix DOS-Enter. Folglicherweise müßte ich den Wert diese Variablen erweitern, damit chomp tut. Frage: wie?
Bei der Ausgabe müsste man dann allerdings das korrekte Zeichen ("\n") an jede Zeile wieder anhängen.
So ähnlich wie oben, vermute ich.
Hilmar, Perlanfänger
Hallo Hilmar,
in der Shell wuerde ich die falschen Umbrueche in dem File einfach mit tr killen:
tr "\r\n" "\n" < BabyTuX_color.eps
oder mit perl:
perl -pe 's/\015/\n/g' BabyTuX_color.eps
Stefan
.
On 16.04.04 Stefan Lagotzki (lago20@gmx.de) wrote:
Hallo Stefan,
oder mit perl:
perl -pe 's/\015/\n/g' BabyTuX_color.eps
Gut, Minimalbeispiel (geklaut von Dir und perlrun)
#!/usr/bin/perl -w
open (BABY,"zabyTuX_color.eps"); while (<BABY>) { s/\015/\n/g } continue { print or die "-p destination: $!\n"; } close (BABY);
Nur, wie baue ich es in das Skript ein? epstopdf macht das filehandle auf, geht dann zeilenweise durch und sucht nach Spuren von der Bounding Box, mittels diverser if-Anweisungen. Dazwischen müßte irgendwo ein Filter, der mir die Enterzeichen entfernt. Ich hab jetzt mal versucht $/ aufzubohren, aber das will nicht gelingen. $/ = "\n:\015"; ganz am Anfang zeitigt nicht die gewünschte Wirkung.
Thanks anyway, H.
Hilmar Preusse hille42@web.de writes:
When ich mittels perl² ein File parsen will, definiere ich mir einfach einen Filehandler, mache dann das Teil mittels open() auf und kann mittels while() zeilenweise durchscannen. Fein. Jetzt habe ich ein File vorliegen, in dem die Zeilenenden auf DOS-Enter enden, will sagen ausschließlich auf dieses Zeichen und kein normales Enter-Zeichen (Beispiel hängt an). Dann hängt sich der Parser weg und erkennt nichts mehr. Gibts dafür eine triviale Lösung? Konkret gehts mir um: http://bugs.debian.org/107258 .
Kann sein, daß ich's zu kompliziert sehe, aber IMHO ist das Problem daher bissel diffiziler, weil die EOLs gemischt auftreten. Die Problemzeile sind Mac EOLs. Diese Mischung mußt Du IMHO auch entsprechend "heterogen" und für Deinen Bug möglichst systemunabhängig behandeln, z.B. so:
--------------------------------------------------------- #! /usr/bin/perl
open F, "< BabyTuX_color.eps" or die "Bummer"; while (<F>) { my @sublines = split /\r(?!\n)/; # \r ohne folgendes \n foreach my $line (@sublines) { chomp $line; print ":$line"."$/"; # "Applikation" } } close F; ---------------------------------------------------------
Das ganze klappt jetzt neben der angegebenen Mischung aus Unix/Mac EOLs auch mit der Mischung DOS/Mac EOLs.
Dort, wo ich "Applikation" hingeschrieben habe, machst du, was Du normalerweise mit einer Zeile machen muß. Falls Du's nur in eine andere Datei konvertieren willst, halt open(FOUT, "> xyz") und "print FOUT" oder sowas.
Beachte, daß beim print nicht "\n", sondern das system-spezifische EOL $/ verwendet wird. Damit sollte es auch unter anderen Systemen klappen (nicht wirklich getestet).
GreetinX Steffen
On 16.04.04 Steffen Schwigon (schwigon@webit.de) wrote:
Hilmar Preusse hille42@web.de writes:
Moin,
When ich mittels perl² ein File parsen will, definiere ich mir einfach einen Filehandler, mache dann das Teil mittels open() auf und kann mittels while() zeilenweise durchscannen. Fein. Jetzt habe ich ein File vorliegen, in dem die Zeilenenden auf DOS-Enter enden, will sagen ausschließlich auf dieses Zeichen und kein normales Enter-Zeichen (Beispiel hängt an). Dann hängt sich der Parser weg und erkennt nichts mehr. Gibts dafür eine triviale Lösung? Konkret gehts mir um: http://bugs.debian.org/107258 .
Kann sein, daß ich's zu kompliziert sehe, aber IMHO ist das Problem daher bissel diffiziler, weil die EOLs gemischt auftreten. Die Problemzeile sind Mac EOLs. Diese Mischung mußt Du IMHO auch entsprechend "heterogen" und für Deinen Bug möglichst systemunabhängig behandeln, z.B. so:
Sorry für die späte Antwort. Erstmal danke auch an Dich. Zunächst sind andere Bugs zu bewältigen. Ich werde mir den anschauen, wenn ich mal wieder zuviel Zeit habe.
H.
Da ich auch immer mit gemischten Mac/Dos-Zeichensätzen zu tun habe, hat sich bei mir sehr gut ein
$line =~ s/\012\015|\015\012|\015|\012//g;
bewährt. Irgendwo habe ich mal gelesen, dass \r und \n nicht immer und überall das sind, was man zu meinen glaubt.
Mit freundlichen Grüßen
Jens Puruckherr
On 27.04.04 Jens Puruckherr (jpuruckherr@cyberport.de) wrote:
Hi,
Da ich auch immer mit gemischten Mac/Dos-Zeichensätzen zu tun habe, hat sich bei mir sehr gut ein
$line =~ s/\012\015|\015\012|\015|\012//g;
bewährt. Irgendwo habe ich mal gelesen, dass \r und \n nicht immer und überall das sind, was man zu meinen glaubt.
Gut, das führt einen Austausch pro Zeile durch (AFAICS). Ich habe aber das Problem, daß der Parser nicht in der Lage ist, das ^M als Zeilenende zu akzeptieren, so das die einzelnen Zeilen nicht getrennt erkannt werden. Oder sehe ich das flasch?
H.
lug-dd@schlittermann.de schreibt:
Gut, das führt einen Austausch pro Zeile durch (AFAICS). Ich habe aber das Problem, daß der Parser nicht in der Lage ist, das ^M als Zeilenende zu akzeptieren, so das die einzelnen Zeilen nicht getrennt erkannt werden. Oder sehe ich das flasch?
Da ist die Frage jetzt, on deine .eps-Datei (ist doch Postscript?) sich dran stört, wenn mehrere Zeilen auf einer Zeile stehen. Da kenn ich mich jetzt nicht aus. Wenn es Schnuppe ist, dann kannst du alle Zeilenumbrüche mit der genannten Methode rauskippen. Wenn nicht, ... hmm ...
Mit freundlichen Grüßen
Jens Puruckherr
* Jens Puruckherr jpuruckherr@cyberport.de [2004-05-07 12:34 +0200]:
Da ist die Frage jetzt, on deine .eps-Datei (ist doch Postscript?) sich dran stört, wenn mehrere Zeilen auf einer Zeile stehen. Da kenn ich mich jetzt nicht aus. Wenn es Schnuppe ist, dann kannst du alle Zeilenumbrüche mit der genannten Methode rauskippen. Wenn nicht, ... hmm ...
fixps (1) - sanitize PostScript files
Das hab ich mal genommen als etwas mit 'poster' nicht funktionierte. Das einzige was er bei der Datei repariert hatte waren lange Zeilen, also könnte es schon sein, daß einige Programme oder Drucker da allergisch drauf reagieren. (Hat mir bei meinem Problem aber nicht geholfen)
On 07.05.04 Stefan Moch (stefan-ml@nine.netcorner.org) wrote:
Moin,
fixps (1) - sanitize PostScript files
Ja, der kann das. Mal sehn ob ich mit dem Code was anfangen kann. Danke.
H.
On 07.05.04 Jens Puruckherr (jpuruckherr@cyberport.de) wrote:
lug-dd@schlittermann.de schreibt:
Moin,
Gut, das führt einen Austausch pro Zeile durch (AFAICS). Ich habe aber das Problem, daß der Parser nicht in der Lage ist, das ^M als Zeilenende zu akzeptieren, so das die einzelnen Zeilen nicht getrennt erkannt werden. Oder sehe ich das flasch?
Da ist die Frage jetzt, on deine .eps-Datei (ist doch Postscript?) sich dran stört, wenn mehrere Zeilen auf einer Zeile stehen. Da kenn ich mich jetzt nicht aus. Wenn es Schnuppe ist, dann kannst du alle Zeilenumbrüche mit der genannten Methode rauskippen.
Nein, ist nicht Schnuppe. epstopdf scannt nach der Bounding Box am Anfang der Zeile. D.h. wir müssen das ^M durch ein Enter-Zeichen ersetzen.
H.
lug-dd@mailman.schlittermann.de