我是一名自学成才的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");
并解决了问题。
答案 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");
并解决了问题。