Thank you VERY much to everyone that responded - the winning solution turned out to be a (-p STDIN) test for - you guessed it, a named pipe. That simple solution eluded me and I thank James who replied to me off-list for it and for not flaming my stupidity. ;)
Also thanks to Dale and Martin, both of whom introduced me to GetOpts::Std - now a standard part of my perl installation. :) --Schuyler > Hello, > > Long-time perl wanna-be-hacker, first time poster here. > > This script is running on a Sunblade 100 running Solaris 9 and the current sun version of perl(based on recommended patch clusters) - 5.6.1. > > I've got a script where I'm trying to read a list of files and switches, sometimes from <STDIN> and sometimes from @ARGV. Here's the part of the script where I check to see if STDIN is a file and read info from @ARGV: > > --------- Begin ------- > if (-f){ > print "STDIN is a file...\n"; > while (<STDIN>) { > chomp; > $use_stdin = "y"; > push @files, $_; > } > $numArgs = $#files + 1; > } > if (!defined @ARGV && !-f) { > die "$usage"; > } > if (!defined $numArgs) { > $numArgs = $#ARGV + 1; > } > > ARG_LOOP: foreach $argnum (0 .. $#ARGV) { # Do stuff with the command line arguments > > my $num_min_args = 1; > if ($ARGV[$argnum] eq "\-h") { > die "$usage\n-w ==> Enable web directory storage. This option will > place output files in the web\/ directory under PMs.\n[Input files] ==> A list of .fig files which are wished to be converted to pdf files. Each xxx.fig will be converted to xxx.pdf.\n\n"; > } > elsif ($ARGV[$argnum] eq "\-w") { > $webdir = "y"; > } > elsif ($numArgs < $num_min_args && $use_stdin ne "y") { > print "\nYou need more arguments - you only gave us $numArgs and we > need > $num_min_args.\n"; > die "$usage"; > } > elsif ($use_stdin ne "y") { > push @files, $ARGV[$argnum]; > } > else { > last ARG_LOOP; > } > } > print "Got $numArgs files to process...\n"; > > ------ End ------- > > So - the jist of it is I wish to send a list of files to be converted either by <STDIN> or @ARGV, and have the script figure it out based on which I pass it. The main reasoning (which may be flawed) I have is that I want to be able to pass it an argument of files (ie fig2pdf.pl *.fig) or pass it a pipeline (ie find . -name "*.pdf" | fig2pdf.pl) but either way I need to also be able to send it a -w switch. > > I've googled this pretty extensively and searched the archives equally vigorously and came up with the 'if (-f)', but neither that nor 'if (-t) seem to ever return a 1 so that the loop is executed. > > Here's the entirety of my code below if you're interested. Apologies in advance - I wrote this in about an hour total and haven't spent much time debugging it. > > #!/usr/bin/perl -w > # > # Written Mon, Sep 20, 2004 by Schuyler Bishop > # > # SCCS ID %W% %G% > # > use strict; > my ($use_stdin, $argnum, $pdffile); > my $numArgs; > my $fig2ps = "/imc/data1/bin/grbatch -device 1 "; > my $webdir = ""; > my @files=(); > my $pwd = `pwd`; > chomp $pwd; > my @pwd_split = split /\//, $pwd; > print "\n"; > my @scr_split = split /\//, $0; > my $script = $scr_split[-1]; > my $usage = "\nUsage: $script [-w] [-h] [Files to convert]\n\n"; > > if (-f){ > print "STDIN is a file...\n"; > while (<STDIN>) { > chomp; > $use_stdin = "y"; > push @files, $_; > } > print "\$numArgs = $#files + 1\n"; > $numArgs = $#files + 1; > } > if (!defined @ARGV && !-f) { > die "$usage"; > } > if (!defined $numArgs) { > $numArgs = $#ARGV + 1; > } > > ARG_LOOP: foreach $argnum (0 .. $#ARGV) { # Do stuff with the command line arguments > > my $num_min_args = 1; > if ($ARGV[$argnum] eq "\-h") { > die "$usage\n-w ==> Enable web directory storage. This option will > place output files in the web\/ directory under PMs.\n[Input files] ==> A list of .fig files which are wished to be converted to pdf files. Each xxx.fig will be converted to xxx.pdf.\n\n"; > } > elsif ($ARGV[$argnum] eq "\-w") { > $webdir = "y"; > } > elsif ($numArgs < $num_min_args && $use_stdin ne "y") { > print "\nYou need more arguments - you only gave us $numArgs and we > need > $num_min_args.\n"; > die "$usage"; > } > elsif ($use_stdin ne "y") { > push @files, $ARGV[$argnum]; > } > else { > last ARG_LOOP; > } > } > print "Got $numArgs files to process...\n"; > > foreach $pdffile (@files) { > print "\nWorking on $pdffile ...\n"; > my $relative; > my @path; > my $dir; > if ($pdffile =~ "\/") { > @path = split /\//, $pdffile; > } > else { > $path[0] = $pdffile; > } > my $basedir; > if ($path[0] eq "." || substr($path[0], 0, 1) ne "\/") { > $relative = "y"; > } > if ($webdir eq "y") { > foreach $dir (@path) { > if ( $dir =~ /PMs/ && $relative ne "y") { > $basedir = "$pwd/$basedir/web"; > } > elsif ($#path eq 0){ > my $pwd_dir; > foreach $pwd_dir (@pwd_split){ > if ($pwd_dir =~ /PMs/){ > $basedir = "$basedir/web"; > } > else { > $basedir = "$basedir/$pwd_dir"; > } > } > last; > } > elsif ($dir eq $path[-1]) { > last; > } > elsif ($dir =~ /PMs/ && $relative eq "y") { > $basedir = ".$basedir/web"; > last; > } > else { > $basedir = "$basedir/$dir"; > } > } > } > else { > foreach $dir (@path) { > if ($#path eq 0 ){ > $basedir = "$pwd/"; > last; > } > elsif ( $dir eq $path[-1] && $relative ne "y") { > last; > } > elsif ($dir eq $path[-1] && $relative eq "y") { > $basedir = ".$basedir"; > last; > } > else { > $basedir = "$basedir/$dir"; > } > } > } > if (!-e $basedir) { > system ("mkdir -p $basedir"); > } > my $in_fig = $pdffile; > my @out_tmp = split /.fig/, $path[-1]; > my $tmp_ps = "$out_tmp[0].ps"; > my $out_pdf = "$out_tmp[0].pdf"; > > unlink '$basedir/$out_pdf'; > system ("$fig2ps $in_fig -printfile $tmp_ps"); > print "Writing to $basedir/$out_pdf ...\n"; > system ("ps2pdf $tmp_ps $basedir/$out_pdf"); > unlink $tmp_ps; > } > print "\n"; > > > _______________________________________________ > Perl-Unix-Users mailing list > [EMAIL PROTECTED] > To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs > _______________________________________________ Perl-Unix-Users mailing list [EMAIL PROTECTED] To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs