Domanda

Sto cercando di gestire la possibilità che senza argomenti e con nessun dato in filodiffusione è passata a uno script Perl. Sto assumendo che, se non ci sono argomenti allora ingresso viene convogliata tramite STDIN. Tuttavia, se l'utente non fornisce argomenti e non lo fa il tubo nulla allo script, si cercherà di ottenere l'input da tastiera. Il mio obiettivo è quello di fornire un messaggio di errore.

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

È stato utile?

Soluzione

Perl viene fornito con il -t operatore 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 questa lavorando bene su Windows con Perl 5.10.0, e Linux con Perl 5.8.8, quindi dovrebbe essere portabile su ambienti più comuni Perl.

Come altri hanno detto, select non sarebbe uno scelta affidabile in quanto vi possono essere momenti in cui stai leggendo da un processo, ma questo processo non ha ancora iniziato a scrivere.

Tutto il meglio,

Paul

Altri suggerimenti

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

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

Si noti che selezionare non sarebbe di grande aiuto in ogni caso, dal momento che produrrebbe risultati falsi se le 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)'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top