访问perl中的文件

时间:2012-08-21 13:42:31

标签: perl

在我的脚本中,我正在处理打开文件和写入文件。我发现我尝试打开的文件存在一些问题,文件存在,它不是空的,我正在将正确的路径传递给文件句柄。

我知道我的问题可能听起来很奇怪但是当我调试我的代码时,我在我的脚本中放了以下命令来检查一些文件

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 ;

2 个答案:

答案 0 :(得分:5)

打印到文件时,Perl会缓冲输出。换句话说,每次你说print时,它实际上都没有写入文件;它可以节省大量数据并一次性写入。这更快。

在你的情况下,你看不到你写的任何文件,因为Perl还没有写任何东西。但是,添加system("ls")调用会导致Perl首先编写输出(解释器足够聪明,可以执行此操作,因为它认为您可能希望使用system()调用对文件执行某些操作刚刚创建。)

你如何解决这个问题?正如choroba建议的那样,您可以在再次打开文件之前关闭该文件进行阅读。或者您可以禁用该文件的缓冲。在打开文件后立即放置此代码:

my $fh = select (unique_fh);
$|=1;
select ($fh);

然后,无论何时打印到文件,都会立即写入($|是一个设置输出缓冲行为的特殊变量)。

首先关闭文件可能是一个更好的主意,尽管可以同时打开文件句柄进行读写。

答案 1 :(得分:3)

在尝试从同一个文件中读取之前,您没有关闭文件句柄。