Perl:通过文件句柄循环

时间:2013-10-11 03:21:36

标签: perl for-loop file-handling filehandle

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

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

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

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

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如何处理文件句柄的复杂性,可能是因为我缺乏正式的培训。如果有人感觉特别有用,那么对我的整体代码质量的任何评论也是受欢迎的。

编辑:发现问题。 Perl无法动态生成目录,因此永远不会创建$species/$geneName目录。我在foreach循环的开头添加了一行,简单地说mkdir("$species/$geneName");并解决了问题。

2 个答案:

答案 0 :(得分:6)

您收到的警告非常明确:

  

使用“严格潜艇”时不允许使用Bareword 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之前,您应该先检查它们是否已打开。

答案 1 :(得分:0)

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