In addition to the code above, you could use the
-t filetest operator to check if
STDIN was opened to a terminal (and thus not a pipe, etc):
if (-t STDIN) {
# we're running from a shell, without input being
# piped to us.
} else {
# ...
}
Or you could also try a non-blocking read of STDIN, which most directly answers your original question of seeing if there is any input waiting without blocking:
use IO::Handle;
STDIN->blocking(0);
# and try to read from it, like you would normally.
my $line = <STDIN>;
if (defined $line) {
# we have input, read succeeded
} else {
# no input at the moment.
}
(Note that this technique may give false negatives if pipes take some time to start writing data.)