Perl文件I / O grep

时间:2015-08-20 01:05:47

标签: perl file io

我可能会在内存中出现语法错误,但是:

use strict;
use warnings;

open(FILE, "+>file") or die "can't open";
print FILE "foo";
if (grep {/^foo$/m}, <FILE>) {
   print "bar";
}
close(FILE) or die "can't close";

为什么没有这个打印栏,我应该怎么做?我正在写一个文件,如果我在继续之前已将某些内容写入文件,我需要检查以后,即。如果foo已经存在那么就不要写foo。

2 个答案:

答案 0 :(得分:3)

从文件中读取数据(例如,<FILE>)开始从当前文件指针读取,而不是从文件的开头读取。在这种情况下,最终成为文件的结尾 - 没有任何内容被读取。

如果你想从一开始就重新开始阅读,你可以先寻找开头:

seek FILE, 0, 0;

但是,请记住,这将非常效率低下。如果您希望这是一项常见的操作,那么将您编写的内容存储到数组中并进行搜索会更好。

答案 1 :(得分:0)

代码可能会导致此问题。

可以缓冲文件的输出,因此在将缓冲区刷新到文件之后,从文件读取将不会看到输出。

此外,当您写入文件时,文件句柄的位置将移动到您已写入的位置的末尾,因此读取将无法看到它。这还没有经过测试,但你应该看看这样的事情。

use Modern::Perl;
use Fcntl qw(SEEK_SET);

open(my $file_handle, "+>", "file") or die "can't open";
print $file_handle "foo";
$file_handle->flush;
seek $file_handle, 0, SEEK_SET);

if (grep {/^foo$/m}, <$file_handle>) {
    print "bar\n";
}

close($file_handle) or die "can't close";