访问perl中的文件

sha*_*haq 2 perl

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

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

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)

dan*_*111 5

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

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

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

my $fh = select (unique_fh);
$|=1;
select ($fh);
Run Code Online (Sandbox Code Playgroud)

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

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