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