http://www.perlmonks.org?node_id=533708


in reply to is filehandler used ?

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.