我不知道到底出了什么问题,但每次执行此脚本时,我都会在“./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);
答案 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)
这些评论解释了您对代码段的两个问题是
第一个很容易解决。知道脚本的其余部分,第二个并不容易修复。我假设在数组数组(?)中每个记录调用一次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);