Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7830[/thread]

Verständnisproblem Streams Umleiten



<< >> 6 Einträge, 1 Seite
Gast Gast
 2006-03-26 17:21
#64086 #64086
Hallo!

Ich habe da ein kleines Verständnis-Problem was das Umleiten von Streams angeht.

Das este Problem ist, warum funktioniert das folgende Beispiel wunderbar (Eingabe wird in die Datei geschrieben)

Code: (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl
use strict;
use warnings;

open(CLIENT, ">client.txt");
print CLIENT "TEST\n";
my $line = <STDIN>;
print CLIENT "$line";
close(CLIENT);


Aber die folgende nicht?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict;
use warnings;

open(CLIENT, ">client.txt");
print CLIENT "TEST\n";
while (my $line = <STDIN>) {
print "$line";
print CLIENT "$line";
}
close(CLIENT);


Hier bleibt die Datei komplett leer.
GwenDragon
 2006-03-26 17:29
#64087 #64087
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/local/bin/perl

local $| = 1;

use strict;
use warnings;

use Fcntl qw( :flock );

open(CLIENT, "> client.txt") or die "konnte nicht öffnen: $!";
flock(CLIENT, LOCK_EX);
print CLIENT "TEST\n" or die "konnte nicht schreiben: $!";
while (my $line = <STDIN>) {
print "$line";
print CLIENT "$line" or die "konnte nicht schreiben: $!";
}
close(CLIENT) or die "konnte nicht schließen: $!";

1;

Geht definitiv bei mir\n\n

<!--EDIT|GwenDragon|1143380137-->
Dubu
 2006-03-26 21:09
#64088 #64088
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=Guest,26.03.2006, 15:21]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl
use strict;
use warnings;

open(CLIENT, ">client.txt");
print CLIENT "TEST\n";
while (my $line = <STDIN>) {
       print "$line";
       print CLIENT "$line";
}
close(CLIENT);


Hier bleibt die Datei komplett leer.[/quote]
Der Code funktioniert bei mir problemlos (per copy & paste). Die Datei wird wie zu erwarten gefüllt.

Unabhängig davon hat GwenDragon natürlich recht mit ihren Anmerkungen bzgl. Fehlerabfragen.
GwenDragon
 2006-03-27 14:09
#64089 #64089
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
@adreask
Und wie bringts du Daten in dein Skript?
Per Kommandozeile?
andreask2
 2006-03-27 15:19
#64090 #64090
User since
2006-03-27
1 Artikel
BenutzerIn
[default_avatar]
[quote=GwenDragon,27.Mar..2006, 12:09][/quote]
Ich starte das Skript in der (Linux-)Kommandozeile. Dann kann ich halt irgendwas eintippen, jedesmal wenn ich [ENTER] klicke, wird diese Zeile nochmal hingeschrieben (print $line funktioniert also), aber es wird eben nichts in die Datei geschrieben. Auch nicht die erste Zeile (print CLIENT "TEST\n";). Die Datei hat die Länge 0! Allerdings kann es damit zu tun haben, dass ich das Skript mit STRG+C beende, vermutlich wird das alles erst in einen Buffer geschrieben, und wenn ich das Skript so zu sagen "unerwatet" abbreche, wird der Buffer nicht mehr in die Datei geschrieben.

Wie kann man diesen Buffer besser kontrollieren? Und vor allem: was macht Ihr anders, bzw. wie ruft Ihr das Skript auf? Wenn ich z.B. Daten per Pipe an das Skript weiterleite, kommen die ja auch auf STDIN an, und dann funktioniert es auf einmal, vermutlich weil das Skript in diesem Fall normal zu Ende läuft, der Buffer geleert wird...

Mir geht es aber um Tastatur-Eingabe - wie muss ich das ändern, dass dies auch so funktioniert?
GwenDragon
 2006-03-27 15:41
#64091 #64091
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Hallo!
Die Dateneingabe wird mit Strg-D beendet! Strg-D ist das Dateiendezeichen.

Strg-C ist ein Abbruch!
Wenn du das Skript irgendwo abbrichst, kann es passieren, dass die Datei nicht geschlossen wird und Buffer nicht geschrieben werden.
<< >> 6 Einträge, 1 Seite



View all threads created 2006-03-26 17:21.