in reply to Re^2: Scoping question - will file handle be closed?
in thread Scoping question - will file handle be closed?

Filehandles are global, irrespective of the scope in which they are referenced. To say the filehandle closes when the reference count reaches zero is incorrect.

oh well, I can't retract what I know to be true!

No, because that would involve learning something?

use strict; use warnings; if (1) { local *FH; my $fh = \*FH; open $fh, 'ls /usr |'; } $_ = <FH>; warn $_; __END__ ls: write error readline() on unopened filehandle FH at - line 10. Use of uninitialized value $_ in warn at - line 12. Warning: something's wrong at - line 12.

Or, simpler demonstration:

use strict; use warnings; { open my $fh, 'ls /usr |'; } warn "End\n"; __END__ ls: write error End

Note how bin/ls complains before the script exits because my $fh is closed when the scope is left, before warn is called.

- tye        

Replies are listed 'Best First'.
Re^4: Scoping question - will file handle be closed? ("global")
by anonymized user 468275 (Curate) on Jul 28, 2015 at 09:13 UTC
    Yes I know what 'local' does, but this topic has nothing to do with the use of local. Please refrain from confusing people at a lower level than yourself, who need to know, for example, how global variables work!

    You could have said, for example, 'Although globals including filehandles do not go out of scope, this behaviour can be avoided using the local keyword' (and then put your example).

    Update: in your second example your variable is specifically of lexical scope, but there is an underlying global that gets assigned to $fh which doesn't go out of scope. OK looks like there's a trick going on here. $fh becomes \*{'::$fh'} which is a global that depends on a local. So although the filehandle isn't closed, it does become lexically inaccessible.

    One world, one people

      Update: in your second example your variable is specifically of lexical scope, but there is an underlying global that gets assigned to $fh which doesn't go out of scope.

      No, you are wrong. But you seem doggedly unable to learn on this point so I won't bother trying further to get you to.

      - tye        

        Technically I was right but it looks like the global depends on $fh and so becomes lexically inaccessible, although that isn't quite the same as being closed. So yes, I have learned something here, thanks.

        One world, one people