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
не будет надежным выбором, так как могут быть моменты, когда вы читаете из процесса, но этот процесс еще не начал писать.
Всего наилучшего,
Пол