2013-10-11 80 views
1

我是一个自学成才的Perler,寻求Perl的专家的协助:的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");并解决了这个问题。

+0

快速浏览'perldoc -f undef'列出你可以使用它的东西。 Bareword文件句柄不在该列表中。接受MVP的建议并使用'close'和词法文件句柄。 – tjd

回答

0

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

6

你得到警告,这是很能说明问题:

裸字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试图写它们之前被打开。

+0

我试过了。不幸的是,我收到一个错误,说我试图在先前关闭的文件句柄上打印:[截图](https://www.evernote.com/shard/s1/sh/dca78b97-9670-4897-b631-0a5b84c0b9c2/ed635c1a5a87bf6fdc6d20aacca3cce9 ) – Ben

+0

我以为'undef'可以让我打开一个单独的文件并重新使用'my $ raw'或'my $ smooth',但似乎并非如此。 – Ben

+0

它没有任何意义,你的屏幕截图仍然*显示全局文件句柄'GENEFILE'。代码'打开我的$ fd,“>”,文件名;打印$ fd“文字”;关闭$ fd;'如果您有权限首先创建'$ filename',则不会失败。请显示您的真实代码。 – mvp