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

Reply via email to