Kevin Pfeiffer wrote:

> In article <[EMAIL PROTECTED]>, John W. Krahn wrote:
> 
>> "R. Joseph Newton" wrote:
>>> 
>>> Kevin Pfeiffer wrote:
>>> 
>>> > I'm looking at HTML::TokeParser. It expects a scalar with a filename
>>> > or a reference to a scalar containing the data to parse.
>>> >
>>> > This works fine:
>>> >
>>> > my $html;
>>> > if (@ARGV) {                              # get filename for
>>> > TokeParser
>>> >   $html = shift;
>>> > } else {
>>> >   my @html = <>;
>>> 
>>> Where is the diamond operator here supposed to be filled from?
>> 
>> <> treats the elements of @ARGV as file names and opens them in order
>> and returns their contents but if @ARGV is empty it returns the contents
>> of STDIN.
> 
> This is what I'm stuck on - is there a way to determine if STDIN is
> getting/is going to get/has gotten any contents?
> 

this might be a little late but the select(r,w,e,t) syscall is what you 
need. the IO::Select module (standard) has a nice OO interface to setting 
up the correct mask for you:

#!/usr/bin/perl -w
use strict;

#-- html.pl

use IO::Select;

if(@ARGV){

        my $filename = shift;

        print "get file $filename\n";

}else{

        my $buf;
        my $line;

        my $io = IO::Select->new(\*STDIN);

        while($io->can_read(0)){
                last unless(sysread(STDIN,$buf,1024));
                $line .= $buf;
        }

        if(defined $line){
                print "get line $line";
        }else{
                print STDERR "no input\n";
        }
}

__END__

[panda]$ html.pl
no input
[panda]$ html.pl file.html
get file file.html
[panda]$ echo "hi" | html.pl
get line hi
[panda]$

perldoc -f select
perldoc IO::Select

david
-- 
$_=q,015001450154015401570040016701570162015401440041,,*,=*|=*_,split+local$";
map{~$_&1&&{$,<<=1,[EMAIL PROTECTED]||3])=>~}}0..s~.~~g-1;*_=*#,

goto=>print+eval

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to