http://www.perlmonks.org?node_id=1022723


in reply to Re^2: printing of an array
in thread printing of an array

$filelist = "C:\Users\cign\Desktop\printFile.txt"; my @files = (file1, file2, file3); open(WRITEFILE, ">$filelist") || die("ERROR: unable to open file \n") +; select WRITEFILE; foreach my $file (@files){ print WRITEFILE ; #"$file\n"; } close WRITEFILE;
I tried running above code, but I am getting error message unable to open file. WHats wrong in here, why can this file handle not open ?

Replies are listed 'Best First'.
Re^4: printing of an array
by AnomalousMonk (Archbishop) on Mar 11, 2013 at 04:15 UTC
    WHats wrong in here, why can this file handle not open ?

    It's good that you are checking the success of the open function call and calling die if it fails. The answer to the question "why?" is contained in the  $! error variable (see perlvar, especially the discussion in Error Variables). Put that in your die function and see the result:
        open(WRITEFILE, ">$filelist") || die("ERROR: unable to open file: $! \n");

    In addition, the statement
        my @files = (file1, file2, file3);
    suggests you are not using warnings and strict at the beginning of your code:
        use warnings;
        use strict;
    I strongly suggest you do so.

    Furthermore, the statement
        $filelist = "C:\Users\cign\Desktop\printFile.txt";
    is highly suspect. Add a print statement for  $filelist immediately after this assignment and check if what is printed is what you expect. The other tactic is to include the filename in delimiters in the die call discussed above:
        open(WRITEFILE, ">$filelist") || die("opening '$filelist': $!\n");

    The next step is to use the three-argument form of open:
        open my $writefile, '>', $filelist or die "opening '$filelist': $!"

Re^4: printing of an array
by perl-diddler (Chaplain) on Mar 31, 2013 at 04:38 UTC
    What's wrong is the way you are entering the file name. Double quotes allow interpretation of what is between them:
    I.e. step 1:
    print out the name of the file:
    perl -e ' use P; my $filelist="C:\Users\cign\Desktop\printFile.txt"; P "opening file: %s", $filelist; ' opening file: C:SERS GNDESKTOPPRINTFILE.TXT
    Is that the file you wanted to open? Prolly not.
    step 2, at least turn on warning and try to use strict - they detect alot (though not all) of problems -- in this case they would have given you a hint:
    perl -we 'use strict; use P; my $filelist="C:\Users\cign\Desktop\printFile.txt"; P "opening file: %s", $filelist;' Unrecognized escape \D passed through at -e line 2. Unrecognized escape \p passed through at -e line 2. opening file: C:SERS GNDESKTOPPRINTFILE.TXT

    use single quotes to define a literal, or put another backslash \ before each \, or use the 'q{...}' operator to really set it off that emphasizes it has to be taken literally (and doesn't interfere with my using single quotes in a 1 line program I typed in on the command line! ;-)

    perl -we 'use strict; use P; my $filelist=q{C:\Users\cign\Desktop\printFile.txt}; P "opening file: %s", $filelist;' opening file: C:\Users\cign\Desktop\printFile.txt ## #alternate ways ## > perl -we 'use strict; use P; my $filelist='\''C:\Users\cign\Desktop\printFile.txt'\''; P "opening file: %s", $filelist;' opening file: C:\Users\cign\Desktop\printFile.txt ## > perl -we 'use strict; use P; my $filelist="C:\\Users\\cign\\Desktop\\printFile.txt"; P "opening file: %s", $filelist;' opening file: C:\Users\cign\Desktop\printFile.txt ### ## my favorite (in a file)... #! perl/bin/perl.exe use strict; use P; my $filelist="C:/Users/../tmp/../Perl64/printFile.txt"; P "opening file: %s", $filelist; open (test, ">", $filelist) or die "didn't work"; print test "Hello World!\n"; close test; C:\Perl64>perl test.pl opening file: C:/Users/../tmp/../Perl64/printFile.txt C:\Perl64>type printFile.txt Hello World!

    Forward slash works in alot of places on Windows cuz the underlying 'NT' OS accepts it.