in reply to Determining indirect filehandles

Hmm, this doesn't seem to be working for me in all cases.

When $fh is a filehandle opened on something like a pipe, on which one cannot seek, the seek fails so it seems as if $fh is not a filehandle. $! holds the reason ("Illegal seek"), and $@ is empty.

If $fh holds a number or a string, the seek fails, but does not die, so again $! holds the reason ("Bad file number") and $@ is empty.

If $fh holds a reference to a something other than a glob or filehandle object, the seek does die, and $@ holds "Not a GLOB reference...", as intended.

I'm not sure how one would distinguish easily between the first two cases, other than by examining $!, which wouldn't be portable.

Replies are listed 'Best First'.
Re: Re: Determining indirect filehandles
by Masem (Monsignor) on Jan 23, 2002 at 19:44 UTC
    Gah, you're right. I didn't test the seek solution with any pipes, and while I did test things like array refs, I didn't test it with scalars directly (mostly because in the app that I want this for, I've already removed scalars from the possible values this snippet would have gotten). However, looking around, it does look like fileno does the trick; pipes are properly recognized, but anything that's not a filehandle triggers a warning. So eval'ing that away captures non-filehandles correctly - at least, as best as I can tell. Snippet above has been updated to reflect this.

    -----------------------------------------------------
    Dr. Michael K. Neylon - mneylon-pm@masemware.com || "You've left the lens cap of your mind on again, Pinky" - The Brain
    "I can see my house from here!"
    It's not what you know, but knowing how to find it if you don't know that's important