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

我无法用perl打开要写入的新文件,perl,output,Perl,Output,我已经查看了几个链接和其他问题,试图找到一个解决方案,但我仍然无法打开我试图打开的文件。这是我无法使用的代码块: $filename = "Related Traits: Chromosome 1"; open ($output1, ">", "gwasfiles4/$filename".".txt"); $length1 = scalar(@chr1); if ($length1 > 1) { @chr1 = sort {$a <=> $b} @chr1;

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

$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";
            }
        }
    }
}
为什么文件没有打开

文件现在打开时包含以下内容,但为空:

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";
            }
        }
    }
}
严格使用;并使用警告;应该始终在程序的开始处。首先修复它们生成的错误,您将获得更好的代码

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

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

如果严格的警告没有足够的帮助,使用诊断;将为您提供有关该问题的另一层信息

autodie特别有用-它可以将其放入或死$!自动在每个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

我建议要么gwasfiles4目录不存在,要么您正在使用不允许冒号的Windows系统:在其文件名中使用autodie;使用诊断;我应该把它放在哪里?打开我的$output1,>,gwasfiles4/$filename.txt或死$!;。同时,严格使用;并使用警告;在脚本的顶部,并修复它们产生的任何错误/警告。独自尝试比询问花费的时间更少。您显示的代码不会生成该警告。请在第94行周围显示代码,其中应包含警告中提到的文件句柄print$output,而不是print$output1完全不同的文件句柄。使用单引号时,$filename将不会被插入。我犯了同样的错误;我在代码的前面有严格的警告,这个块大约在第100行。我尝试了这个,它打开了文件,但文件是空的,不应该是空的。下面是我使用的确切代码:$filename=Related_Traits_chromose_1_$ARGV[0];打开我的$output1,'>',gwasfiles4/$filename或die$!;my$length1=scalarmy@chr1;如果$length1>1{@chr1=sort{$a$b}@chr1;对于我的$x=0;$x可能值得编辑到您的问题中,而不是作为评论发布。@Jack scalarmy@foo将始终为零。您的if语句中没有任何内容将运行。gwasfiles4确实存在,我在mac上使用文本wrangler,请您再次检查问题,我编辑了它。Thanks@Jack:正如其他人所说,$length1在该代码中始终为零,因此您的if块将永远不会执行,但在这种情况下-您也无法获得对关闭的filehandle的打印。为什么$length1始终为零,我如何解决此问题?@Sobrique打印可能在OP未显示的代码中稍后发生。请注意,错误消息提到filehandle$output,而在他们的代码段中打印使用$output1。
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