m.lochhead
m.lochhead

Reputation: 23

what is wrong with the syntax that does not give me an outfile?

I dont know what exactly is wrong but everytime I execute this script i keep getting "No such file or directory at ./reprioritize line 35, line 1".

here is my script that is having an issue:

my $newresult = "home/user/newresults_percengtage_vs_pn";

sub pushval
        {
        my @fields = @_;
        open OUTFILE, ">$newresult/fixedhomdata_030716-031316.csv" or die $!;   #line 35
        while(<OUTFILE>)
        {
                if($fields[5] >= 13)
                {
                        print OUTFILE "$fields[0]", "$fields[1]","$fields[2]","$fields[3]","$fields[4]","$fields[5]", "0";
                }
                elsif($fields[5] < 13 && $fields[5] > 1)
                {
                        print OUTFILE "$fields[0]", "$fields[1]","$fields[2]","$fields[3]","$fields[4]","$fields[5]", "1";
                }
                elsif($fields[5] <= 1)
                {
                        print OUTFILE "$fields[0]", "$fields[1]","$fields[2]","$fields[3]","$fields[4]","$fields[5]", "2";
                }
        }
        close (OUTFILE);

Upvotes: 0

Views: 102

Answers (2)

PerlDuck
PerlDuck

Reputation: 5730

You may want to have a look at Perl's tutorial on opening files.

I simplify it a bit. There are basically three modes: open for reading, open for writing, and open for appending.

Reading

Opening for reading is indicated by either a < preceeding the filename or on its own, as a separate parameter to the open() call (preferred), i.e.:

my $fh = undef;
my $filename = 'fixedhomdata_030716-031316.csv';
open($fh, "<$filename") or die $!;      # bad   
open($fh, '<', $filename) or die $!;    # good
while( my $line = <$fh> ) {             # read one line from filehandle $fh
   ...
}
close($fh);

When you open the file this way, it must exist, else you get your error (No such file or directory at ...).

Writing

Opening for writing is indicated by a >, i.e.:

open($fh, ">$filename") or die $!;      # bad   
open($fh, '>', $filename) or die $!;    # good
print $fh "some text\n";                # write to filehandle $fh
print $fh "more text\n";                # write to filehandle $fh
...
close($fh);

When you open the file this way, it is truncated (cleared) and overwritten if it existed. If it did not exist, it will get created.

Appending

Opening for appending is indicated by a >>, i.e.:

open($fh, ">>$filename") or die $!;     # bad   
open($fh, '>>', $filename) or die $!;   # good
print $fh "some text\n";                # append to filehandle $fh
print $fh "more text\n";                # append to filehandle $fh
...
close($fh);

When you open the file this way and it existed, then the new lines will be appended to the file, i.e. nothing is lost. If the file did not exist, it will be created (as if only > had been given).

Your error message doesn't match your code. You opened the file for writing (>) but got doesn't exist, which indicates that you actually opened it for reading.

This might have happened because you use OUTPUT as a filehandle instead of a scoped variable, e.g. $fh. OUTPUT is a global filehandle, i.e. if you open a file this way, then all of your code (no matter which function in) can use OUTPUT. Don't do that. From the docs:

An older style is to use a bareword as the filehandle, as

    open(FH, "<", "input.txt")
       or die "cannot open < input.txt: $!";

Then you can use FH as the filehandle, in close FH and and so on. Note that it's a global variable, so this form is not recommended in new code.

To summarize:

  • use scoped variables as filehandles ($fh instead of OUTPUT)
  • open your file in the right mode (> vs. <)
  • always use three-argument open (open($fh, $mode, $filename) vs. open($fh, "$mode$filename")

Upvotes: 1

SparkeyG
SparkeyG

Reputation: 532

The comments explain that your two issues with the snippet are

  1. The missing leading '/' in the $newresult declaration
  2. You are treating your filehandle as both a read and a write.

The first is easy to fix. The second is not as easy to fix properly with knowing the rest of the script. I am making an assumption that pushval is called once per record in a Array of Arrays(?). This snippet below should get the result you want, but there is likely a better way of doing it.

my $newresult = "/home/user/newresults_percengtage_vs_pn";

sub pushval{
        my @fields = @_;
        open OUTFILE, ">>$newresult/fixedhomdata_030716-031316.csv" or die $!;   #line 35
        print OUTFILE "$fields[0]", "$fields[1]","$fields[2]","$fields[3]","$fields[4]","$fields[5]"
        if($fields[5] >= 13) {
              print OUTFILE "0\n";
        } elsif($fields[5] < 13 && $fields[5] > 1) {
              print OUTFILE "1\n";
        } elsif($fields[5] <= 1) {
              print OUTFILE "2\n";
        }

        close (OUTFILE);

Upvotes: 0

Related Questions