User since
2003-09-22
10
Artikel
BenutzerIn
Hi,
gibt es eine Moeglichkeit zu testen ob in STDIN was drin ist, bevor ich anfange daraus zu lesen?
by, Martin
User since
2003-08-04
1706
Artikel
HausmeisterIn
Sag mal in welchem Bezug.
Als Benutzereingabe, Teil einer Pipe?
Gruß Alex
User since
2003-09-29
69
Artikel
BenutzerIn
Davon weiss ich nichts. Aber wo liegt das Problem dabei, nach dem ersten Lesen auf Erfolg zu prüfen und ggf. abzubrechen?
User since
2003-08-04
1706
Artikel
HausmeisterIn
Prüfen iss net.
Entweder will dein Programm was von STDIN oder nicht.
Wenns was von STDIN will, wartet es solange bis was mit \n bestätigt kommt.
Gruß Alex
User since
2003-09-22
10
Artikel
BenutzerIn
[quote=format_c,29.09.2003, 12:40]Wenns was von STDIN will, wartet es solange bis was mit \n bestätigt kommt.[/quote]
> Wenns was von STDIN will, wartet es solange bis was mit \n bestätigt kommt.
Ja, das ist ebend das Problem.
Mein Programm bekommt eine Mail per STDIN uebergeben. Fuer den Fall das keine Mail kommt soll es mit einem Fehler abbrechen. Oder kann ich irgendwie ein Timeout einbauen? Wenn er nach 1 minute nix bekommen hat, dann abbrechen?!
by, Martin
User since
2003-09-29
69
Artikel
BenutzerIn
Das stimmt natürlich. Einfaches Lesen führt unter Umständen zur Blockierung.
Dafür gibt's die "select" Funktion: perldoc -f select
Oder noch hübscher:
IO::Select. Da kann man dann can_read abfragen.
User since
2003-08-04
93
Artikel
BenutzerIn
Weiss nicht ob es in deinem Fall funktioniert ... aber auf normaler Kommandozeilenebene gibts das Array @ARGV
könntest dann einfach so prüfen:
if ( @ARGV > 0 ) { }
Live long and prosper!
42;
User since
2003-09-22
10
Artikel
BenutzerIn
In @ARGV stehen aber nur die Argumente drin die ich dem Programm uebergeben habe. Das was ueber STDIN an das Programm gesendet wird steht dort nicht drin. Mein Programm wird folgendermassen aufgerufen
cat mail | mda [EMAIL=user1@asd.de]user1@asd.de[/EMAIL] [EMAIL=user2@dfg.de]user2@dfg.de[/EMAIL]
Ich schau mir mal select und IO::Select an.
by, Martin
User since
2003-08-21
2614
Artikel
ModeratorIn
Die Frage ist, was genau Du mit "drin ist" meinst. Wenn STDIN vom Terminal kommt, ist immer was "drin", bis jemand Strg-D (bzw Strg-Z auf einigen Betriebssystemen) drueckt. Wenn allerdings _wirklich_ nix drin ist kannst Du es mit eof testen:
: | perl -le 'print eof(STDIN)'
User since
2003-09-22
10
Artikel
BenutzerIn
OK, fuer alle die es interessiert, so mach ich das nun:
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use IO::Select;
my $sel = new IO::Select( "STDIN");
if(!$sel->can_read( 3 )) {
die "STDIN ist leer\n";
}
print "Hier geht das Programm weiter..\n";
by & und Danke nochmal fuer den Hinweis auf IO::Select, Martin