没有给我一个outfile的语法有什么问题?

时间:2016-03-15 14:17:42

标签: perl

我不知道到底出了什么问题,但每次执行此脚本时,我都会在“./reprioritize第35行,第1行”中收到“没有这样的文件或目录”。

这是我的脚本有问题:

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

2 个答案:

答案 0 :(得分:1)

您可能需要查看Perl's tutorial on opening files

我简化了一下。基本上有三种模式:打开阅读,打开,打开追加

阅读的开头由文件名前面的<或单独指示,作为open()调用(首选)的单独参数,即:< / p>

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

以这种方式打开文件时,必须存在,否则会出现错误(No such file or directory at ...)。

编写

撰写的开头由>表示,即:

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

以这种方式打开文件时,它会被截断(清除)并覆盖(如果存在)。如果它不存在,它将被创建。

附加

追加的开头由>>表示,即:

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

当您以这种方式打开文件并且它存在时,新行将被附加到文件中,即没有丢失任何内容。如果文件没有 存在,它将被创建(就好像只有>一样)。

您的错误消息与您的代码不符。您打开文件进行书写(>),但得到doesn't exist,表示您实际打开了该文件进行阅读。

可能已经发生,因为您使用OUTPUT作为文件句柄而不是范围变量,例如$fh。 OUTPUT是一个全局文件句柄,即如果以这种方式打开文件,那么所有代码​​(无论哪个函数都可以)都可以使用OUTPUT。不要这样做。来自docs

  

较旧的风格是使用裸字作为文件句柄,如

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

然后您可以使用FH作为文件句柄,在关闭FH中等等。   请注意,它是一个全局变量 ,因此不建议使用此表单   在新代码中。

总结:

  • 使用范围变量作为文件句柄($fh而不是OUTPUT
  • 以正确的模式(><
  • 打开您的文件
  • 始终使用三参数打开(open($fh, $mode, $filename)open($fh, "$mode$filename")

答案 1 :(得分:0)

这些评论解释了您对代码段的两个问题是

  1. $ newresult声明中缺少前导'/'
  2. 您将文件句柄视为读取和写入。
  3. 第一个很容易解决。知道脚本的其余部分,第二个并不容易修复。我假设在数组数组(?)中每个记录调用一次pushval。下面的代码片段应该可以获得您想要的结果,但可能有更好的方法。

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