IO::Interactive is a Perl module with utilities for interactive I/O.
SYNOPSIS
use IO::Interactive qw(is_interactive interactive busy);
if ( is_interactive() ) {
print "Running interactivelyn";
}
# or...
print {interactive} "Running interactivelyn";
$fh = busy {
do_noninteractive_stuff();
}
This module provides three utility subroutines that make it easier to develop interactive applications...
is_interactive()
This subroutine returns true if *ARGV and *STDOUT are connected to the terminal. The test is considerably more sophisticated than:
-t *ARGV && -t *STDOUT
as it takes into account the magic behaviour of *ARGV.
You can also pass is_interactive a writable filehandle, in which case it requires that filehandle be connected to a terminal (instead of *STDOUT). The usual suspect here is *STDERR:
if ( is_interactive(*STDERR) ) {
carp $warning;
}
interactive()
This subroutine returns *STDOUT if is_interactive is true. If is_interactive() is false, interactive returns a filehandle that does not print.
This makes it easy to create applications that print out only when the application is interactive:
print {interactive} "Please enter a value: ";
my $value = ;
You can also pass interactive a writable filehandle, in which case it writes to that filehandle if it is connected to a terminal (instead of writinbg to *STDOUT). Once again, the usual suspect is *STDERR:
print {interactive(*STDERR)} $warning;
busy {...}
This subroutine takes a block as its single argument and executes that block. Whilst the block is executed, *ARGV is temporarily replaced by a closed filehandle. That is, no input from *ARGV is possible in a busy block. Furthermore, any attempts to send input into the busy block through *ARGV is intercepted and a warning message is printed to *STDERR. The busy call returns a filehandle that contains the intercepted input.
A busy block is therefore useful to prevent attempts at input when the program is busy at some non-interactive task.
Product's homepage
Requirements:
· Perl