在我的脚本中,我正在处理打开文件和写入文件.我发现我尝试打开的文件存在一些问题,文件存在,它不是空的,我正在将正确的路径传递给文件句柄.
我知道我的问题可能听起来很奇怪但是当我调试我的代码时,我在我的脚本中放入以下命令来检查一些文件
system ("ls");
Run Code Online (Sandbox Code Playgroud)
然后我的脚本运行良好,当它被删除它不再正常工作.
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 ;
Run Code Online (Sandbox Code Playgroud)
打印到文件时,Perl会缓冲输出.换句话说,每次你说时它实际上都没有写入文件print; 它可以节省大量数据并一次性写入.这更快.
在你的情况下,你看不到你写的任何文件,因为Perl还没有写任何东西.system("ls")但是,添加调用会导致Perl首先编写输出(解释器足够聪明,可以执行此操作,因为它认为您可能希望使用该system()调用对您刚刚创建的文件执行某些操作).
你怎么解决这个问题?正如choroba建议的那样,您可以在再次打开文件之前关闭该文件进行阅读.或者您可以禁用该文件的缓冲.在打开文件后立即放置此代码:
my $fh = select (unique_fh);
$|=1;
select ($fh);
Run Code Online (Sandbox Code Playgroud)
然后,无论何时打印到文件,它都会立即写入($|是一个设置输出缓冲行为的特殊变量).
首先关闭文件可能是一个更好的主意,尽管可以同时使用文件句柄进行读写.
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |