Как я могу проверить (посмотреть) STDIN для данных по конвейеру в Perl без использования select?

$url = 'http://www.mydomain.in/abc/';

print_r(parse_url($url));

echo parse_url($url, PHP_URL_host);
10
задан rtruszk 27 December 2014 в 21:03
поделиться

2 ответа

Perl идет -t оператор теста файла, который говорит Вам, если конкретный дескриптор файла открыт для TTY. Так, необходимо смочь сделать это:

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

Быстрый тест показывает это хорошо работающее в Windows с Perl 5.10.0 и Linux с Perl 5.8.8, таким образом, это должно быть портативно через наиболее распространенные среды Perl.

Поскольку другие упомянули, select не был бы надежный выбор, поскольку могут быть времена, когда Вы читаете из процесса, но тот процесс не начал писать все же.

Всего наилучшего,

Paul

20
ответ дан 3 December 2019 в 16:31
поделиться
use POSIX 'isatty';
if ( ! @ARGV && isatty(*STDIN) ) {
    die "usage: ...";
}

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

Обратите внимание, что выбор не был бы большим количеством справки так или иначе, так как это привело бы к ложным результатам, если бы переданная по каналу информация еще не была готова. Пример:

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)'
5
ответ дан 3 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: