1

我是一名自学成才的 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 如何处理文件句柄的复杂性,可能是因为我缺乏正规培训。如果有人觉得特别有帮助,也欢迎对我的整体代码质量发表任何评论。

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

4

2 回答 2

6

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

使用“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

于 2013-10-11T03:30:30.753 回答
0

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

于 2013-10-13T14:36:38.983 回答