...
unless( is_filehandle( $arg ) {
open $arg, '...', $arg or die $!;
}
...
####
#! 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
####
#! 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{
local $^W;
my $arg = shift;
my $p = eval{ tell( $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__
[ 6:39:21.75] C:\test>junk6
1:Ack
hashref:Ack
arrayref:Ack
globref:Ack
in-memory:Ack
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