2009-02-06 15 views
9

Sto tentando di gestire la possibilità che nessun argomento e nessun dato inviato venga passato a uno script Perl. Suppongo che se non ci sono argomenti, allora l'input viene inviato tramite STDIN. Tuttavia, se l'utente non fornisce argomenti e non inserisce nulla nello script, proverà a ottenere input da tastiera. Il mio obiettivo è di fornire invece un messaggio di errore.Come posso controllare (guardare) STDIN per i dati inviati in Perl senza usare select?

Sfortunatamente, select() non è portabile su alcuni sistemi non POSIX. C'è un altro modo per farlo con la massima portabilità?

risposta

19

Perl viene fornito con l'operatore -t di file-test, che ti dice se un particolare filehandle è aperto ad un TTY. Quindi, si dovrebbe essere in grado di fare questo:

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. 
} 

Un test rapido rivela questo bel lavoro su Windows con Perl 5.10.0, e Linux con Perl 5.8.8, quindi dovrebbe essere portabile sul più comune Perl ambienti.

Come altri hanno già detto, select non sarebbe una scelta affidabile in quanto potrebbero esserci delle volte in cui stai leggendo da un processo, ma quel processo non ha ancora iniziato a scrivere.

Tutto il meglio,

Paul

+0

Confermato di lavorare su Mac OS X. +5 se possibile, ma non posso, quindi +1. –

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

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

Nota che selezionare non sarebbe di grande aiuto in ogni caso, dal momento che produrrebbe risultati falsi se informazioni in filodiffusione non era ancora pronto. Esempio:

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

Questo non è migliore di 'select()', si sta utilizzando troppo POSIX. L'OP ha detto esplicitamente: * Sfortunatamente, select() non è portabile su alcuni sistemi non POSIX. * – nyuszika7h

+0

Sto spiegando cosa sarebbe meglio di selezionare dove la portabilità non POSIX non è un problema. – ysth

Problemi correlati