First, my confusion: "filehandler" is something that handles files, and "filehandle" is a handle to a (or token for a) file. You have a filehandle.
Second, the solution: Using fileno works fine for files. On Linux/unix, it probably works for sockets, fifos, and many other things. On no platform does it work for IO::String or handles to a string buffer (e.g., open OUT, '>', \$buffer). If you are only worried about real files, that's fine.
Instead, you will pretty much need to keep the state seperate. For example, using a symref:
my $fh;
open $fh, "<", "/etc/shadow" or $fh = undef;
if ($fh) {
# do stuff
}
Now it doesn't matter what you have that you're reading from - failure results in an undef. (Not quite true - if you start using the forking version of open, such as "-|" or "|-", then things have to work a bit differently.)
Personally, I just merge it all:
if (open my $fh, "<", "/etc/shadow")
{
# do stuff.
close $fh;
}
Anywhere inside the if, the filehandle is good. Anywhere outside, the filehandle doesn't even exist. |