Teile von STDIN in Datei umleiten

Hallo liebe Gruppe :-)

Ich stehe wie der sprichwörtliche Ochs vorm Berg und frage mich, ob ich=

soviel verlernt oder noch nie was kapiert habe. Folgendes Szenario: Ich
habe ein Programm, das mir etliche Daten auf dem Bildschirm ausgibt und
von denen ich gerne einige schön formatiert in einer Datei hätte. Als=
o
dachte ich einfach ein Perl-Skript (mein erstes seit Jahren) schreiben
und es in einer Pipe aufrufen:

programm | ./skript.pl

Ich benutze bash, MacOSX 10.4.6 und perl 5.8.6 und dachte folgendes
Skript schreibt mir die interessante Information in eine Datei, aber ich =

habe immer nur eine leere Datei. Der reguläre Ausdruck stimmt, d.h. wen=
n
ich 'print "$1"."\n";' schreibe bekomme ich die entsprechende und
korrekte Ausgabe auf dem Schirm.

Kann mir jemand sagen, welchen blöden Fehler ich gemacht und übersehe=
n habe?

Mit bestem Dank
Martin

#!/usr/bin/perl -w

$line =3D <>;

open (OUT,">kinetic.dat");

while ( $line ne "" ) {
if ( $line =3D~ /T: *(\d*\.\d*)/ ) {
print OUT "$1"."\n";
}
print ($line);

$line =3D <>;
}

close(OUT);
Martin Buchmann [ Di, 30 Mai 2006 15:16 ] [ ID #1335686 ]

Re: Teile von STDIN in Datei umleiten

Martin Buchmann <Martin.Buchmann [at] uni-jena.de> writes:

> [...] Kann mir jemand sagen, welchen blöden Fehler ich gemacht und
> übersehen habe?
>
> #!/usr/bin/perl -w
>
> $line = <>;
>
> open (OUT,">kinetic.dat");
>
> while ( $line ne "" ) {
> if ( $line =~ /T: *(\d*\.\d*)/ ) {
> print OUT "$1"."\n";
> }
> print ($line);
>
> $line = <>;
> }
>
> close(OUT);

Du hast uns nicht verraten, welches Verhalten du von deinem Programm
erwartest. Wenn ich hier

lala
T: 14.15
jaja

in das Programm füttere, dann steht in kinetic.dat anschließend 14.15.

Zeig mal deine Eingabedaten.

Peter

P.S.:

>Organization: [...] Institut für Materwisschenschaft

Fällt das nicht unters Folterverbot? ;-)

--
Dipl.-Ing. Peter Ehrenberg Tel.: +49 40 756604-40
Auf der Höhe 29 Netz: http://dipe.de/
21109 Hamburg Perl · Oracle · Linux · Netzwerk
Germany Softwareentwicklung · Installation · Administration
Peter Ehrenberg [ Di, 30 Mai 2006 15:37 ] [ ID #1335687 ]

Re: Teile von STDIN in Datei umleiten

Hallo nochmal,

Martin Buchmann said the following on 30.05.2006 15:16 Uhr:

> Ich stehe wie der sprichw=C3=B6rtliche Ochs vorm Berg und frage mich, o=
b ich
> soviel verlernt oder noch nie was kapiert habe. Folgendes Szenario: Ich=

> habe ein Programm, das mir etliche Daten auf dem Bildschirm ausgibt und=

> von denen ich gerne einige sch=C3=B6n formatiert in einer Datei h=C3=A4=
tte. Also
> dachte ich einfach ein Perl-Skript (mein erstes seit Jahren) schreiben =

> und es in einer Pipe aufrufen.

Das klappt auch, allerdings enth=C3=A4lt die Datei erst die Informationen=
,
die ich wollte, wenn mein Programm fertig ist und das dauert eben 15
Minuten :-) Ich habe mal kurz an so was gedacht, aber es mangels
Hintergrundwissen =C3=BCber Pipes, Prozesse, usw. als unwahrscheinlich
abgetan und dachte der Fehler liegt in meinen =E2=80=9EPerl-K=C3=BCnsten=E2=
=80=9C begr=C3=BCndet ;-)

Wenn mir dazu jemand einen Tipp geben kann, wie ich simultane Ausgaben
erzeugen kann, bzw was erkl=C3=A4ren kann/will, bin ich jederzeit Ohr.

Gru=C3=9F
Martin
Martin Buchmann [ Di, 30 Mai 2006 15:38 ] [ ID #1335688 ]

Re: Teile von STDIN in Datei umleiten

Martin Buchmann wrote:

>>ein Perl-Skript (mein erstes seit Jahren)

Ja, das sieht man.

> Wenn mir dazu jemand einen Tipp geben kann, wie ich simultane Ausgaben
> erzeugen kann, bzw was erklären kann/will, bin ich jederzeit Ohr.

$ perldoc -q unbuffer

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Frank Seitz [ Di, 30 Mai 2006 15:49 ] [ ID #1335689 ]

Re: Teile von STDIN in Datei umleiten

Hallo Peter,

> in das Programm füttere, dann steht in kinetic.dat anschließend 14.=
15.

Ja, inzwischen bei mir auch :-) (siehe mein anderes Posting)

>> Organization: [...] Institut für Materwisschenschaft
>
> Fällt das nicht unters Folterverbot? ;-)

Wahrscheinlich schon, da sieht man mal was man so gedankenlos für Fehle=
r
einbaut, die jahrelang unentdeckt bleiben ;-)

Gruß
Martin
Martin Buchmann [ Di, 30 Mai 2006 15:58 ] [ ID #1335691 ]

Re: Teile von STDIN in Datei umleiten

Hallo Frank,

Frank Seitz said the following on 30.05.2006 15:49 Uhr:

>> Wenn mir dazu jemand einen Tipp geben kann, wie ich simultane Ausgaben=

>> erzeugen kann, bzw was erklären kann/will, bin ich jederzeit Ohr.
>
> $ perldoc -q unbuffer

Vielen Dank, werde ich mir angucken!
Martin
Martin Buchmann [ Di, 30 Mai 2006 16:00 ] [ ID #1335692 ]

Re: Teile von STDIN in Datei umleiten

Martin Buchmann wrote:

> Ich benutze bash, MacOSX 10.4.6 und perl 5.8.6 und dachte folgendes
> Skript schreibt mir die interessante Information in eine Datei, aber ich
> habe immer nur eine leere Datei. Der reguläre Ausdruck stimmt, d.h. wenn
> ich 'print "$1"."\n";' schreibe bekomme ich die entsprechende und
> korrekte Ausgabe auf dem Schirm.

Also bei mir funktioniert es:
helmut [at] xp2400:$ cat test.txt
T: 123.123
sdasd
dgf

t: 345.345
helmut [at] xp2400:$ cat test.txt | perl ./test.pl
T: 123.123
sdasd
dgf

t: 345.345
Use of uninitialized value in string ne at ./test.pl line 13, <> line 5.
helmut [at] xp2400:$ cat kinetic.dat
123.123
helmut [at] xp2400:$ perl -v

This is perl, v5.8.8 built for i486-linux-gnu-thread-multi
[...]
helmut [at] xp2400:/home-work/wording/d-i-perl$ uname -a
Linux xp2400 2.6.16-1-k7 #2 Thu May 4 18:35:10 UTC 2006 i686 GNU/Linux

Von der Übersichtlichkeit her würd ich es eher so schreiben:

#!/usr/bin/perl -w

open (OUT,">kinetic.dat");

while ( my $line = <> ) {
if ( $line =~ /T: *(\d*\.\d*)/ ) {
print OUT "$1"."\n";
}
if ( $line !~ /^$/ ) {
print ($line);
}
}

close(OUT);

Dann funktioniert es, und das Warning ist auch weg.

Helmut Wollmersdorfer
Helmut Wollmersdorfer [ Di, 30 Mai 2006 16:00 ] [ ID #1335693 ]
Perl » de.comp.lang.perl.misc » Teile von STDIN in Datei umleiten

Vorheriges Thema: jpeg viewer
Nächstes Thema: Monat zu Zahl?