[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