2015-08-18 127 views
-4

我查看了几个链接和其他问题以尝试找到一个解决方案,但我仍然无法打开正在尝试打开的文件。这是代码块,我不能去功能:我无法打开一个新的文件在perl中写入

$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"; 
      } 
     } 
    } 
} 
+0

'use autodie;使用诊断;' –

+0

我会在那里放? – Jack

+1

'打开我的$ output1,“>”,“gwasfiles4/$ filename.txt”或死掉$ !;'。另外,在脚本的顶部放置'use strict;'和'use warnings'',并修复它们产生的错误/警告。 – stevieb

回答

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

使用单引号时,不会插入'$ filename'。我犯了同样的错字;) – stevieb

+0

好点 - 编辑。 – Sobrique

+0

我在代码中有严格和警告,这个块在100行左右。我试了这个,它打开了文件,但文件是空的,它不应该是这样。这里是我使用的确切代码: – Jack

0

我建议无论是目录gwasfiles4不存在或you'rte在Windows工作系统不允许在其文件名中使用冒号:

+0

'gwasfiles4'确实存在,我在使用文本处理程序的Mac上,请你再次检查问题,我编辑它。谢谢 – Jack

+1

@Jack:正如其他人所说的那样,'$ length1'将在该代码中始终为零,因此您的'if'块将永远不会执行 – Borodin

+0

但是在这种情况下,您无法获得'print to closed filehandle' 。 – Sobrique

相关问题