【问题标题】:I can't open a new file to write to in perl我无法在 perl 中打开要写入的新文件
【发布时间】:2015-08-18 15:02:25
【问题描述】:

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

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

【问题讨论】:

  • use autodie; use diagnostics;
  • 我会把它放在哪里?
  • open my $output1, "&gt;", "gwasfiles4/$filename.txt" or die $!;。此外,将use strict;use warnings; 放在脚本的顶部,并修复它们产生的任何错误/警告。
  • 尝试自己的事情比问要花更少的时间。
  • 您显示的代码不会生成该警告。请在第 94 行显示代码,其中应包含 print $output(警告中提到的文件句柄),而不是 print $output1(完全不同的文件句柄)。

标签: perl output


【解决方案1】:

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

【讨论】:

  • 使用单引号,$filename 不会被插值。我犯了同样的错字;)
  • 我在代码前面有严格和警告,这个块大约在第 100 行。我试过这个,它打开了文件,但文件是空的,它不应该是。这是我使用的确切代码:
  • my $filename = "Related_Traits_Chromosome_1_$ARGV[0]"; open (my $output1, '&gt;', "gwasfiles4/$filename") or die $!; my $length1 = scalar(my @chr1); if ($length1 &gt; 1) { @chr1 = sort {$a &lt;=&gt; $b} @chr1; for (my $x = 0; $x &lt;= $length1; $x++){ for (my $y = $x + 1; $y &lt;= $length1 - 1; $y++){ if (abs($chr1[$x] - $chr1[$y]) &lt; 500000){ print $output1 "$chr1[$x]\t$chr1[$y]\n"; } } } }
  • 可能值得将其编辑到您的问题中,而不是作为评论发布。
  • @Jack scalar(my @foo) 将始终为零。 if 语句中的任何内容都不会运行。
【解决方案2】:

我建议要么目录 gwasfiles4 不存在,要么您使用的 Windows 系统不允许在其文件名中使用冒号 :

【讨论】:

  • gwasfiles4 确实存在,我在使用 text wrangler 的 Mac 上,您能否再次检查问题,我对其进行了编辑。谢谢
  • @Jack:正如其他人所说,$length1 在该代码中将始终为零,因此您的 if 块将永远不会被执行
  • 但在这种情况下 - 你也无法获得print to closed filehandle
  • 为什么$length1 总是为零,我该如何解决?
  • @Sobrique print 可能稍后在 OP 未显示的代码中发生。请注意,错误消息提到了文件句柄 $output,而他们的 sn-p 中的 print 使用 $output1
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 2022-01-22
  • 2018-02-25
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多