in reply to Re: 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. Try it...
use strict; use warnings; if (1) { my $fh = \*FH; open $fh, 'ls /usr |'; } $_ = <FH>; warn $_;
After the closing braces, there is nothing left in scope. In spite of that the filehandle FH remains open and $_ will be populated with the first file in /usr.

Update: I didn't realise I was arguing against perldoc. LOL, oh well, I can't retract what I know to be true!

One world, one people

Replies are listed 'Best First'.
Re^3: Scoping question - will file handle be closed? ("global")
by tye (Sage) on Jul 17, 2015 at 18:45 UTC

    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        

      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        

Re^3: Scoping question - will file handle be closed?
by afoken (Chancellor) on Jul 17, 2015 at 15:48 UTC
    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.

    Not quite right, as you know by now, but also not completely wrong. Filehandles are a limited resource, no matter what language you use to write your software. So it is generally a good idea to close filehandles if they are no longer needed.

    Modern operating systems with a lot of memory generally allow many file handles, but still you can run out of filehandles:

    >perl -Mstrict -w -E 'my @h; for my $i (1..5000) { open $h[$i],"<","/d +ev/null" or die "$i $!"; }' 1022 Too many open files at -e line 1.

    (Linux 3.10.17 x64)

    C:\>perl -Mstrict -w -E "my @h; for my $i (1..5000) { open $h[$i],'<', +'nul' or die qq[$i $!]; }" 2046 Too many open files at -e line 1.

    (Windows 7 64 Bit)

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
Re^3: Scoping question - will file handle be closed?
by choroba (Cardinal) on Jul 17, 2015 at 10:33 UTC
    FH contains the reference in this case. That's why you should use
    open my $FH, '-|', qw{ ls usr } or die $!;
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re^3: Scoping question - will file handle be closed?
by hippo (Archbishop) on Jul 17, 2015 at 12:44 UTC
    After the closing braces, there is nothing left in scope. In spite of that the filehandle FH remains open

    ... which means that FH is indeed still in scope and that the reference count is therefore non-zero.