Michael Weber wrote:
> I am trying to write a simple filter that will mark in different
> colors certain words as they pass through.
>
> For example, if I do a tail -f /var/log/messages I want words I am
> looking for to be in red and other words in yellow with the rest of
> the text unchanged. (There might be a way to do this already, but
> you can learn a lot by reinventing wheels sometimes!)
>
> Here's the basic frame of code I'm using:
>
> #!/usr/bin/perl -w
>
> use strict;
>
> my $line;
>
> while(1) {
> $line = <STDIN>;
> # Highlighting code goes here...
> print $line;
> }
>
>
> When I use a command like "cat textfile.txt | ./filter-test.pl" I get
> the text file printed out, just like I want, followed by an infinate
> number of "Use of uninitialized value in print at
> ./filter-test.pl line
> 9, <STDIN> line 185."
That's because after cat finishes, an EOF condition exists on STDIN, so
$line = <STDIN> sets $line to undef.
To end the loop, you can use "last":
defined($line = <STDIN>) or last;
But it looks like you can just move that into the while condition:
while ($line = <STDIN>) {
...
}
That loop will end when there is no more input on STDIN.
But why force the input to come from STDIN? The more flexible construct
would
be:
while ($line = <>) {
...
}
This allows you to optionally specifiy filename(s) as command-line args. If
no files are specified, it automagically reads from stdin.
>
> But, when I use the command "tail -f /var/log/messages |
> filter-test.pl", it works fine.
Well, not really. tail -f never ends, so you never see the EOF condition on
STDIN. When you press ^C, the terminal driver sends a SIGINT to both
processes,
which causes them to end.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]