2

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

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

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 ;
4

2 回答 2

5

当您打印到文件时,Perl 会缓冲输出。换句话说,每次你说print;它实际上并没有写入文件。它保存了一堆数据并一次将其全部写入。这更快。

在您的情况下,您看不到您写入文件的任何内容,因为 Perl 还没有写入任何内容。然而,添加system("ls")调用会导致 Perl 首先编写您的输出(解释器足够聪明,可以这样做,因为它认为您可能想要使用system()调用来对刚刚创建的文件执行某些操作)。

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

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

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

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

于 2012-08-21T14:17:52.613 回答
3

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

于 2012-08-21T14:03:14.400 回答