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)
#!/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?
#!/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.
User since
2005-01-17
14748
Artikel
Admin1
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-->
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
[quote=Guest,26.03.2006, 15:21]
#!/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.
User since
2005-01-17
14748
Artikel
Admin1
@adreask
Und wie bringts du Daten in dein Skript?
Per Kommandozeile?
User since
2006-03-27
1
Artikel
BenutzerIn
[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?
User since
2005-01-17
14748
Artikel
Admin1
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.