#! perl -slw package main; use strict; use FileHandle; use IO::File; use IO::Socket::INET; sub ok{ my( $code, $wanted, $label, $value ) = @_; my $bool = $code->( $value ); return $label . ':' . ( $bool == $wanted ? 'Ack' : 'Nak' ); } sub isIO { my $arg = shift; my $p = eval{ fileno( $arg ) }; return defined( $p ) && $p >=0 ? 1 : 0; } my @handles = ( [0, "1", 1], [0, "hashref", {}], [0, "arrayref", []], [0, "globref", \*INC], [1, "in-memory", do {{ my $buf; open my $fh, "<", \$buf; $fh }}], [1, "FH1 glob", do {{ open FH1, "<", "nul"; *FH1 }}], [1, "FH2 globref", do {{ open FH2, "<", "nul"; \*FH2 }}], [1, "FH3 string", do {{ no strict; $FH3 = 'nul'; open FH3; FH3 }}], [1, "STDIN glob", \*STDIN], [1, "STDOUT glob", \*STDOUT], [1, "plain read", do {{ open my $fh, "<", "nul"; $fh }}], [1, "plain write", do {{ open my $fh, ">", "nul"; $fh }}], [1, "FH read", FileHandle->new("< nul")], [1, "FH write", FileHandle->new("> nul")], [1, "I::F read", IO::File->new("< nul")], [1, "I::F write", IO::File->new("> nul")], [1, "pipe read", do {{ open my $fh, "ver |"; $fh }}], [1, "pipe write", do {{ open my $fh, "| more"; $fh }}], [1, "socket", IO::Socket::INET->new(LocalAddr => sprintf('localhost:%d', 10000 + rand 20000))], ); print ok( \&isIO, @$_ ) for @handles; __END__ 1:Ack hashref:Ack arrayref:Ack globref:Ack in-memory:Nak FH1 glob:Ack FH2 globref:Ack FH3 string:Ack STDIN glob:Ack STDOUT glob:Ack plain read:Ack plain write:Ack FH read:Ack FH write:Ack I::F read:Ack I::F write:Ack pipe read:Ack pipe write:Ack socket:Ack