in reply to Permission denied when opening files in Windows

I'd recommend adding an 'or die' statement to your open statement like:

open(my $fh2, ">", $output) or die "Unable to open file '$output': $! +\n";

Your code has a check on closing the file, but not on opening the file. Modifying your open statement to something like what I listed above will show you when the code encounters an issue with opening a file. I personally like to use the die message listed above because it will show me both the file name/path that was provided to open as well as the reason for failing to open the file.

Replies are listed 'Best First'.
Re^2: Permission denied when opening files in Windows
by Laurent_R (Canon) on Mar 27, 2015 at 19:00 UTC
    I agree with you, but would suggest it is better not to have "\n" at the end of the die message. You get more information from $! die without it.

    Update: Thanks tye: more information from die, not from $! as originally written.

    Je suis Charlie.
      it is better not to have "\n" at the end of the die message. You get more information from $! without it.

      The extra information has nothing to do with $! (see die for details).

      BTW, since you (the OP) are using Windows, you may want to include $^E in addition to $! as $^E will sometimes have a more to-the-point explanation, especially in "permission denied" scenarios.

      - tye        

      I'm not saying that you're wrong about that, but can you point me to where this behavior change of $! is documented?

      I have never tried testing to see if die "$!" provides more information than die "$!\n". The reason that I have been including "\n" is that I'm primarily working on Windows and I have seen instances where not using "\n", the next command prompt is being displayed on the last output line of the die statement. That's not necessarily a major issue, but I do find that to be a bit annoying. By adding "\n", this puts the next command prompt on a new line.

      After seeing your post, I've looked at the perldocs for open, perliol, perlopentut, and perlvar and I was not able to find anything that indicated that "\n" would affect the contents of $!. If what you are saying is true, then it might a good idea if the perldoc for open could be updated since there are a few examples of open or die structure that has "$!\n" in the input to the die statement.

      On the other hand, I did find information in perlvar that corroborates what tye said about $^E potentially providing more detailed information on some operating systems (including Windows).

        I have never tried testing to see if die "$!" provides more information than die "$!\n".

        It does:

        $ perl -e 'open FOO, "<", "dontexist" or die "$!\n"' No such file or directory $ perl -e 'open FOO, "<", "dontexist" or die "$!"' No such file or directory at -e line 1.

        It can also provide information on the currently open file, see e.g. second example here.

        I was not able to find anything that indicated that "\n" would affect the contents of $!.

        AFAIK it doesn't. Perhaps Laurent_R meant to say "You get more information from die without it."

        Sorry, I typed this a bit too fast. As pointed out by tye and anonymous monk, the difference is associated with die rather that with $!
        Je suis Charlie.