perl打印到文件,STDOUT是该文件

时间:2019-05-24 09:46:34

标签: perl file-handling

我的程序正在尝试打印到一个文件,该文件就是STDOUT。 可以说, print“ text here”; 打印到文件x.log,而我还试图像 print FH1中那样使用文件处理程序方法将文件打印到x.log文件“在此处输入文字”; 。我注意到当先提供文件处理程序方法语句,然后再提供STDOUT过程时。我的第二张照片可以覆盖第一张照片,我想进一步了解为什么会出现这种情况。

这让我想到了竞争状况,或者文件处理程序比STDOUT打印语句要慢(如果它通过缓冲区?)。我不确定Perl的工作方式。 Perl版本-5.22.0

1 个答案:

答案 0 :(得分:4)

据我了解,您的程序基本上是这样的:

open(my $fh,'>','foobar.txt');
print $fh "foo\n";
print "bar\n"; # prints to STDOUT

然后使用它,将STDOUT在外壳中重定向到程序中已经打开的相同文件中:

$ perl test.pl > foobar.txt

这将为同一文件打开两个独立的文件句柄:一个在程序内,另一个在启动程序的Shell中。两个文件句柄管理它们自己的文件位置以进行写入,从位置0开始并在每次写入后前进该位置。

由于这些文件句柄彼此独立,因此无论这些其他文件句柄位于程序内部还是外部,它们都不会在意当前是否有其他文件句柄在处理该文件。这意味着这些写入将相互覆盖。

除此之外,还完成了内部缓冲,即每个print将首先导致对某个内部缓冲区的写操作,并且可能立即导致对文件句柄的写操作。何时将数据写入文件句柄取决于文件句柄的模式,即无缓冲,行缓冲或特定大小的缓冲区。这使得结果有点不可预测。

如果您不希望这种行为,但仍想使用多个文件句柄写入同一文件,则最好使用追加模式,即在两个Perl中都使用>>而不是>打开代码和外壳。这将确保所有数据都将附加到文件的末尾,而不是写入文件句柄所维护的文件位置。这样,数据将不会被覆盖。另外,您可能希望使文件句柄不带缓冲,以便文件中的数据最终以与print语句相同的顺序结束:

open(my $fh,'>>','foobar.txt');
$fh->autoflush(1); # make $fh unbuffered
$|=1;   # make STDOUT unbuffered
print $fh "foo\n";
print "bar\n"; # prints to STDOUT

$ perl test.pl >> foobar.txt