2009-02-06 10 views
9

Próbuję obsłużyć możliwość, że żadne argumenty i żadne dane potokowe nie są przekazywane do skryptu Perl. Zakładam, że jeśli nie ma żadnych argumentów, to wejście jest przesyłane przez STDIN. Jeśli jednak użytkownik nie poda żadnych argumentów i niczego nie dopuści do skryptu, spróbuje uzyskać wejście klawiatury. Moim celem jest zamiast tego dostarczyć komunikat o błędzie.Jak mogę sprawdzić (zerknąć) STDIN dla danych potokowych w Perlu bez użycia select?

Niestety, select() nie jest przenośny dla niektórych systemów innych niż POSIX. Czy jest inny sposób na zrobienie tego z maksymalną przenośnością?

Odpowiedz

19

Perl pochodzi z operatorem -t plik testu, który informuje, czy dana filehandle jest otwarte do TTY. Tak, powinieneś być w stanie to zrobić:

if (-t STDIN and not @ARGV) { 
    # We're talking to a terminal, but have no command line arguments. 
    # Complain loudly. 
} 
else { 
    # We're either reading from a file or pipe, or we have arguments in 
    # @ARGV to process. 
} 

Szybki test ujawnia ten działa poprawnie w systemie Windows z Perl 5.10.0 i Linux z Perl 5.8.8, więc powinno być przenośne całej najczęściej Perl środowiska.

Jak już wspomniano, select nie byłby niezawodnym wyborem, ponieważ może się zdarzyć, że czytasz z procesu, ale proces ten jeszcze się nie zaczął.

Wszystko co najlepsze,

Paul

+0

Potwierdzone do pracy na Mac OS X. +5, jeśli mogę, ale nie mogę, więc +1. –

5
use POSIX 'isatty'; 
if (! @ARGV && isatty(*STDIN)) { 
    die "usage: ..."; 
} 

Patrz: http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html

Należy pamiętać, że wybór nie byłby dużo pomocy w każdym razie, ponieważ spowodowałoby to fałszywe wyniki jeśli nastrojową informacji nie był jeszcze gotowy. Przykład:

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)' 
+0

To nie jest lepsze niż 'select()', używasz POSIX też. Program operacyjny wyraźnie powiedział: * Niestety, opcja select() nie jest przenośna dla niektórych systemów innych niż POSIX. * – nyuszika7h

+0

Wyjaśniam, co byłoby lepsze niż wybór, gdzie nie ma zastosowania przenośność niezgodna z POSIX. – ysth

Powiązane problemy