【问题标题】:Perl: Looping through filehandlesPerl:循环文件句柄
【发布时间】:2013-10-11 03:21:36
【问题描述】:

我是一名自学成才的 Perler,正在寻求 Perl 专家的帮助:

我一直收到一个错误消息,说我不能在foreach 循环中使用文件句柄,即使我确定close 它(或undef 它,我都试过了)。在此处查看完整错误:http://cl.ly/image/2b2D1T403s14

代码在 GitHub 上可用:https://github.com/bsima/yeast-TRX

有问题的代码可以在文件“script.pl”的第 90 行左右找到:

foreach my $species (keys %Saccharomyces) {
    open(RAW,">./data/$species/$geneName/raw.csv");
        print RAW "gene,dinucleotide,position,trx.score,energy.score\n";
    undef RAW; 
    open(SMOOTH,">./data/$species/$geneName/smooth.csv");
        print SMOOTH "gene,position,trx.score,energy.score\n";
    undef SMOOTH;
}

非常感谢您的帮助!我不知道 Perl 如何处理文件句柄的复杂性,可能是因为我缺乏正规培训。如果有人觉得特别有帮助,也欢迎任何关于我的整体代码质量的 cmets。

编辑:发现问题。 Perl 无法即时生成目录,因此甚至从未创建过$species/$geneName 目录。我在 foreach 循环的开头添加了一行,简单地说 mkdir("$species/$geneName"); 并解决了问题。

【问题讨论】:

  • 快速浏览perldoc -f undef 列出了您可以使用它的种类。裸字文件句柄不在该列表中。听取 MVP 的建议并使用 close 和词法文件句柄。

标签: perl for-loop file-handling filehandle


【解决方案1】:

您收到的警告非常有说服力:

使用“strict subs”时不允许使用裸词 RAW

另外,undef FILEHANDLE 不如close FILEHANDLE

解决方案是对文件句柄使用普通作用域变量并关闭它们,如下所示:

foreach my $species (keys %Saccharomyces) {
    open my $raw, ">", "./data/$species/$geneName/raw.csv";
    print $raw "gene,dinucleotide,position,trx.score,energy.score\n";
    close $raw;
    open my $smooth, ">", "./data/$species/$geneName/smooth.csv";
    print $smooth "gene,position,trx.score,energy.score\n";
    close $smooth;
}

此外,您应该在尝试写入之前检查 $raw$smooth 是否已打开。

【讨论】:

  • 我试过了。不幸的是,我收到一条错误消息,提示我正在尝试在以前关闭的文件句柄上打印:screenshot
  • 我认为undef 可以让我打开一个单独的文件并重新使用my $rawmy $smooth,但事实并非如此。
  • 这没有任何意义,您的屏幕截图仍然显示全局文件句柄GENEFILE。如果您首先有权创建$filename,则代码open my $fd, ">", filename; print $fd "text"; close $fd; 不会失败。请出示您的真实代码。
【解决方案2】:

Perl 无法即时生成目录,因此甚至从未创建过$species/$geneName 目录。我在 foreach 循环的开头添加了一行,简单地说 mkdir("$species/$geneName"); 并解决了问题。

【讨论】:

    猜你喜欢
    • 2019-12-12
    • 2015-04-13
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多