jsnicaise has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks, I have a simple script that ends up in a Permission Denied error somewhere in the loop, when trying to open files for writing. I've searched around for answers, but nothing seems conclusive enough. There are no anti-virus installed on my machine, no backup software that could lock files, etc. I've tried active perl and strawberry perl. The code:
foreach my $lineData (@inputData) { @lineValue = split(',', $lineData); print $lineValue[0]; print $lineValue[1]; $output = $lineValue[0].".cfg"; $conf = "define hostgroup{\n\thostgroup_name\t\t" . $lineValue +[0] . "\n\talias\t\t" . $lineValue[1] . "\n}\n"; open(my $fh2, ">", $output); print $fh2 $conf; close $fh2 or warn $! ? "Error closing sort pipe: $!" : "Exit +status $? from sort"; }
Any thoughts? Thanks!

Replies are listed 'Best First'.
Re: Permission denied when opening files in Windows
by dasgar (Priest) on Mar 27, 2015 at 18:41 UTC

    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.

      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).

Re: Permission denied when opening files in Windows
by atcroft (Abbot) on Mar 27, 2015 at 18:36 UTC

    Considering that you are on a Microsoft platform, have you tried testing the directory you to write to and the file you are writing to (overwriting?) to ensure you have permission to write to it as your user?

    $output = $lineValue[0].".cfg"; # begin untested code use File::Basename; # May be moved to top of script my $output_dir = File::Basename::dirname $output; if ( not ( -w $output_dir ) ) { die "No permission to write to directory $output_dir\n"; } elsif ( not ( -w $output ) ) { die "No permission to write to file $output\n"; } # end untested code open(my $fh2, ">", $output) or die $!;

    Hope that helps.

Re: Permission denied when opening files in Windows
by jsnicaise (Initiate) on Mar 27, 2015 at 19:33 UTC
    Thanks atcroft, that code lead me to understanding why I couldn't create a file named prn.cfg (prn.anything, actually).

    http://superuser.com/questions/613313/why-cant-we-make-con-prn-null-folder-in-windows

      Windows inherits from DOS.

      In retrospect, I feel compelled to point out that this was not meant to be a pun, given modern day meanings for "DOS".

Re: Permission denied when opening files in Windows
by Anonymous Monk on Mar 28, 2015 at 08:01 UTC
    sub Fudge can provide you with a more verbose error message