perl/unix question
bpmedley at 4321.tv
bpmedley at 4321.tv
Wed Aug 1 20:43:05 EDT 2001
Hi,
I have a perl / unix question. It has to do with getting input from the
user. Below is what I want:
Situation: Running perl script w/o piping data to it
- If the user starts the program with no file list then they are prompted
for input.
- If the user passes in a file list, that does not contain '-', then they
are not prompted for input.
- If the user passes in a file list, that does contain '-', then they are
prompted only when '-' is open.
Situation: Running perl script when piping data to it
- This should never prompt.
Below are examples:
./script.pl
always prompt
./script.pl file -
no prompting when parsing 'file'
prompt when parsing '-'
./script.pl file
never prompt
echo input | ./script.pl
never prompt
echo input | ./script.pl file -
never prompt
Based on my (probably incomplete tests) I have a script that does that.
However, it is IMHO, a less than ideal setup. I am curious if you can
come up w/ a better version than what I've got. I have attached my
version.
~'`^`'~=-.,__,.-=~'`^`'~=-.,__,.-=~'`^`'~=-., \|/ (___) \|/ _,.-=~'`^`
Brian Medley @~./'O o`\.~@
"Knowledge is Power" brian.medley at verizon.net /__( \___/ )__\ *PPPFFBT!*
-- Francis Bacon `\__`U_/'
_,.-=~'`^`'~=-.,__,.-=~'`^`'~=-.,__,.-=~'`^`'~= <____|' ^^`'~=-.,__,.-=
~`'^`'~=-.,__,.-=~'`^`'~=-.,__,.-=~'`^`'~=-.,__,.-==--^'~=-.,__,.-=~'`^`
-------------- next part --------------
#! /usr/bin/perl -w
use strict;
use POSIX;
#
# This is a small program that tries to intelligently prompt the user. Below are some
# cases that show when to prompt the user for input.
#
# case:
# ./kill_names.pl
# always prompt
#
# case:
# ./kill_names.pl -
# always prompt
#
# case:
# ./kill_names.pl file -
# no prompting when parsing 'file'
# prompt when parsing '-'
#
# case:
# ./kill_names.pl file
# never prompt
#
# case:
# echo input | ./kill_names.pl
# never prompt
#
# case:
# echo input | ./kill_names.pl file -
# never prompt
#
# BEGIN prompt if:
# STDIN is a terminal && first file will be STDIN (i.e. '-')
# this will happen if no arguments to script or if the '-' filename is passed
# in.
#
# START prompting if:
# STDIN is a terminal && next file will be STDIN.
#
my $isatty;
my $prompt_msg;
my $FH;
my $favorite_food;
my $yucky_food;
# these are needed to determine if we need to prompt the user
$isatty = POSIX::isatty (fileno (STDIN));
@ARGV = ('-') unless @ARGV;
# our personal tastes
$favorite_food = ",cookies,ice cream,cake,linux,penguins,apple pie,";
$yucky_food = ",carrots,microsoft,windows,brussel sprouts,corn,";
while ($FH = shift) {
open FH, $FH or warn "Can't open $FH: $!\n";
$prompt_msg = "";
$prompt_msg = "Feed me: " if "-" eq $FH && $isatty;
print $prompt_msg;
while (<FH>) {
chomp;
if (/^\s*$/) {
print "No input detected.\n";
next;
}
# :)
if ($favorite_food =~ /,$_,/) {
print "mmm...I like $_\n";
} elsif ($yucky_food =~ /,$_,/) {
print "yuck...I hate $_\n";
} else {
print "sigh..I guess $_ is OK\n";
}
} continue {
print "$prompt_msg";
} # end searching the user's file
# this tries to make the ouput less "jagged" (b/c when the user types EOF a
# newline is not output)
if ("-" eq $FH && $isatty && POSIX::isatty (fileno (STDOUT))) {
print "\n";
}
} # end parsing file list
More information about the Discuss
mailing list