我无法在perl中打开要写入的新文件

时间:2015-08-18 15:02:25

标签: perl output

我已经查看了几个链接和其他问题以尝试找到解决方案,但我仍然无法打开我尝试打开的文件。这是我无法运行的代码块:

$filename = "Related Traits: Chromosome 1";
open ($output1, ">", "gwasfiles4/$filename".".txt");
$length1 = scalar(@chr1);
if ($length1 > 1) {
    @chr1 = sort {$a <=> $b} @chr1;
    for ($x = 0; $x <= $length1; $x++){
        for ($y = $x + 1; $y <= $length1 - 1; $y++){
            if (abs($chr1[$x] - $chr1[$y]) < 500000){
                print $output1 "$chr1[$x]\t$chr1[$y]\n";
            }
        }
    }
}

当我运行时,我收到错误:

print() on closed filehandle $output at file.pl line 94

为什么文件没有打开?

该文件现在打开,但是为空:

my @chr1;
my $filename = "Related_Traits_Chromosome_1_$ARGV[0]";
open (my $output1, '>', "gwasfiles4/$filename") or die $!;
my $length1 = scalar(@chr1);
if ($length1 > 1) {
    @chr1 = sort {$a <=> $b} @chr1;
    for (my $x = 0; $x <= $length1; $x++){
        for (my $y = $x + 1; $y <= $length1 - 1; $y++){
            if (abs($chr1[$x] - $chr1[$y]) < 500000){
                print $output1 "$chr1[$x]\t$chr1[$y]\n";
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

use strict;use warnings;应始终位于您的计划的开头。修复它们首先生成的错误,您将获得更好的代码。

同样 - 您应该检查open的错误代码:

open my $output1, '>', "gwasfiles4/$filename.txt" or die $!;

这将打印open失败时生成的错误。我猜测gwasfiles4不存在,或者您的操作系统不喜欢带有嵌入式:的文件名。

如果strictwarnings没有足够的帮助,use diagnostics;将为您提供有关该问题的另一层信息。

autodie特别有用 - 它会在每个or die $!语句后自动放置open行。 (以及其他一些事情)。

我建议作为一种风格点 - 在打印时将你的词法文件句柄包含在{}中,因为这使得它非常清楚它是一个文件句柄。

print {$output1} "$chr1[$x]\t$chr1[$y]\n";

编辑:

根据您的更改,您遇到了完全不同的问题:

my @chr1;                    #create empty array
my $length1 = scalar(@chr1); # scalar here takes length, array is empty, therefore length is _always_ zero. 
if ($length1 > 1) {          #therefore never happens

答案 1 :(得分:0)

我建议目录gwasfiles4不存在或者在Windows系统上工作,该系统不允许在其文件名中使用冒号: