If the file handle came from a piped open "close" will additionally return false if one of the other system calls involved fails or if the program exits with non-zero status. (If the only problem was that the program exited non-zero $! will be set to 0.) Closing a pipe also waits for the pro- cess executing on the pipe to complete, in case you want to look at the output of the pipe after- wards, and implicitly puts the exit status value of that command into $?.