在我的脚本中,我正在处理打开文件和写入文件。我发现我尝试打开的文件存在一些问题,文件存在,它不是空的,我正在将正确的路径传递给文件句柄。
我知道我的问题可能听起来很奇怪但是当我调试我的代码时,我在我的脚本中放了以下命令来检查一些文件
system ("ls");
然后我的脚本运行良好,当它被删除时它不再正常工作。
my @unique = ("test1","test2");
open(unique_fh,">orfs");
print unique_fh @unique ;
open(ORF,"orfs")or die ("file doesnot exist");
system ("ls");
while(<ORF>){
split ;
}
@neworfs=@_ ;
print @neworfs ;
答案 0 :(得分:5)
打印到文件时,Perl会缓冲输出。换句话说,每次你说print
时,它实际上都没有写入文件;它可以节省大量数据并一次性写入。这更快。
在你的情况下,你看不到你写的任何文件,因为Perl还没有写任何东西。但是,添加system("ls")
调用会导致Perl首先编写输出(解释器足够聪明,可以执行此操作,因为它认为您可能希望使用system()
调用对文件执行某些操作刚刚创建。)
你如何解决这个问题?正如choroba建议的那样,您可以在再次打开文件之前关闭该文件进行阅读。或者您可以禁用该文件的缓冲。在打开文件后立即放置此代码:
my $fh = select (unique_fh);
$|=1;
select ($fh);
然后,无论何时打印到文件,都会立即写入($|
是一个设置输出缓冲行为的特殊变量)。
首先关闭文件可能是一个更好的主意,尽管可以同时打开文件句柄进行读写。
答案 1 :(得分:3)
在尝试从同一个文件中读取之前,您没有关闭文件句柄。