Pergunta

Eu estou tentando lidar com a possibilidade de que sem argumentos e sem dados encanada é passado para um script Perl. Estou assumindo que, se não há argumentos, em seguida, a entrada está sendo canalizada via STDIN. No entanto, se o usuário fornece nenhum argumento e não tubulação nada para o roteiro, ele vai tentar obter a entrada do teclado. Meu objetivo é fornecer uma mensagem de erro.

Infelizmente, select() não é portátil para alguns sistemas não-POSIX. Existe outra maneira de fazer isso com o máximo de portabilidade?

Foi útil?

Solução

Perl vem com o operador arquivo-teste -t, que informa se um filehandle especial está aberta a um TTY. Então, você deve ser capaz de fazer isso:

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

Um teste rápido revela esta multa de trabalho no Windows com Perl 5.10.0, e Linux com Perl 5.8.8, por isso deve ser portável entre os ambientes mais comuns Perl.

Como já foi mencionado, select não seria uma escolha confiável, pois pode haver momentos em que você está lendo a partir de um processo, mas esse processo ainda não começou a escrever ainda.

Todo o melhor,

Paul

Outras dicas

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

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

Note que escolha não seria de muita ajuda de qualquer maneira, uma vez que iria produzir falsos resultados Se a informação canalizada não estava pronto ainda. Exemplo:

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top