[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Omaha.pm] bad perl - need help - dispatch table




On Aug 26, 2004, at 11:01 AM, Miller, Scott L (Omaha Networks) wrote:
Otherwise the (<>) will either ignore <STDIN> because there are filename
on ARGV, or ignore the filenames because it's got stuff to process on
<STDIN>.  It's been too long since I ran into the problem to remember
which...

If does one or the other, depending.  -grin-

perldoc perlop:

The null filehandle <> is special: it can be used to emulate the behav- ior of sed and awk. Input from <> comes either from standard input, or from each file listed on the command line. Here's how it works: the first time <> is evaluated, the @ARGV array is checked, and if it is empty, $ARGV[0] is set to "-", which when opened gives you standard input. The @ARGV array is then processed as a list of filenames. The
       loop

           while (<>) {
               ...                     # code for each line
           }

       is equivalent to the following Perl-like pseudo code:

           unshift(@ARGV, '-') unless @ARGV;
           while ($ARGV = shift) {
               open(ARGV, $ARGV);
               while (<ARGV>) {
                   ...         # code for each line
               }
           }

except that it isn't so cumbersome to say, and will actually work. It really does shift the @ARGV array and put the current filename into the $ARGV variable. It also uses filehandle ARGV internally--<> is just a synonym for <ARGV>, which is magical. (The pseudo code above doesn't
       work because it treats <ARGV> as non-magical.)

You can modify @ARGV before the first <> as long as the array ends up containing the list of filenames you really want. Line numbers ($.) continue as though the input were one big happy file. See the example
       in "eof" in perlfunc for how to reset line numbers on each file.

I've always wanted what <> does -- files *or* wait for STDIN. I suppose you could kludge up something to do files, then wait for STDIN...? You'd always *have to* have STDIN, though...

j