On Mon, 28 Apr 2008, Rafael Garcia-Suarez wrote: > 2008/4/28 Matt Sergeant <matt@sergeant.org>: >> The following code: >> >> if (open(my $fh, "/etc/passwd")) { >> ... >> } >> >> Leaves the file open at the exit of the scope (in fact to the end of the >> program). But $fh is out of scope, meaning the file should be closed. > > I think that's known. This is mostly because we want to allow this construct: > > if (my $x) { } elsif ($x) { } > > so, the $x is freed after the closing bracket of the if. Yeah, that's bugged me before - I thought it might be related... But if the $x is freed there then why isn't the filehandle closed until program exit? > A proper fix would be to add an "invisible" block around the if. That > would slow down all ifs a bit, though. I don't think that works either: perl -Mstrict -le 'if (1) { if (open(my $fh, q(/etc/passwd))) { print "inner"; } } system(qq(ls -l /proc/$$/fd));' Shows that the filehandle just isn't closed AT ALL (until program exit). Matt.Thread Previous | Thread Next