我可能会在内存中出现语法错误,但是:
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。
答案 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";